플러그 인 및 RealTimeStylus 클래스
RealTimeStylus 개체는 태블릿 펜에서 데이터 스트림에 실시간으로 액세스할 수 있도록 설계되었습니다. IStylusSyncPlugin 또는 IStylusAsyncPlugin 인터페이스를 구현하는 개체인 플러그 인을 RealTimeStylus 개체에 추가할 수 있습니다. 동기 플러그 인은 일반적으로 우선 순위가 높은 스레드에서 RealTimeStylus 개체에 의해 직접 호출되는 반면, 비동기 플러그 인은 일반적으로 애플리케이션의 UI(사용자 인터페이스) 스레드에서 호출됩니다. 데이터 스트림에 대한 실시간 액세스가 필요하고 패킷 필터링과 같이 계산적으로 의미 없는 작업에 동기 플러그 인을 만들거나 사용합니다. 잉크 컬렉션과 같이 데이터 스트림에 실시간으로 액세스할 필요가 없는 작업에 비동기 플러그 인을 만들거나 사용합니다.
특정 작업은 계산이 필요하지만 다중 입력 제스처 인식과 같은 데이터 스트림에 대한 실시간 액세스가 필요할 수 있습니다. 이러한 요구 사항을 해결하기 위해 StylusInput API는 각각 자체 스레드에서 실행되는 두 개의 RealTimeStylus 개체를 사용할 수 있는 계단식 RealTimeStylus 모델을 제공합니다. 계단식 RealTimeStylus 모델에 대한 자세한 내용은 Cascaded RealTimeStylus 모델을 참조하세요.
IStylusSyncPlugin 및 IStylusAsyncPlugin 인터페이스는 모두 동일한 메서드를 정의합니다. 이러한 메서드를 사용하면 RealTimeStylus 개체가 비동기 플러그 인인지 동기 플러그 인인지 여부에 관계없이 각 플러그 인에 펜 데이터를 전달할 수 있습니다. Microsoft.StylusInput.IStylusSyncPlugin.DataInterest 및 Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest 속성을 사용하면 각 플러그 인이 태블릿 펜 데이터 스트림의 특정 데이터를 구독할 수 있습니다. 플러그 인은 해당 작업을 수행하는 데 필요한 데이터만 구독하여 성능 요구를 최소화해야 합니다. 스레딩 및 RealTimeStylus 클래스에 대한 자세한 내용은 StylusInput API에 대한 스레딩 고려 사항을 참조하세요.
RealTimeStylus 개체는 Microsoft.StylusInput.PluginData 네임스페이스의 개체를 사용하여 펜 데이터를 플러그 인에 전달합니다. RealTimeStylus는 플러그 인에서 throw된 예외도 catch합니다. RealTimeStylus가 예외를 catch하면 IStylusSyncPlugin.Error 또는 IStylusAsyncPlugin.Error 메서드를 호출하여 플러그 인에 알립니다. 플러그 인 데이터 사용에 대한 자세한 내용은 플러그 인 데이터 및 RealTimeStylus 클래스를 참조하세요. 오류 처리에 대한 자세한 내용은 StylusInput API에 대한 오류 처리 고려 사항 및 플러그 인 데이터 및 RealTimeStylus 클래스의 오류 데이터 섹션을 참조하세요.
참고
RealTimeStylus 개체를 사용하도록 설정하려면 먼저 하나 이상의 플러그 인을 RealTimeStylus 개체에 연결해야 합니다.
다음 topics 플러그 인의 몇 가지 일반적인 범주에 대해 설명합니다.
특별 고려 사항
RealTimeStylus 개체의 복잡한 특성으로 인해 다음 사항에 유의해야 합니다.
플러그 인이 연결된 플러그 인 컬렉션을 수정하는 경우 RealTimeStylus 개체는 예외를 throw합니다. 이 문제는 플러그 인이 RealTimeStylus 개체에서 해당 컬렉션의 멤버로 호출되는 동안에만 발생합니다.
다음 C# 예제는 RealTimeStylus 개체가 예외를 throw하도록 하는 코드입니다.
using Microsoft.Ink;
using Microsoft.StylusInput;
using Microsoft.StylusInput.PluginData;
// ...
public class thePlugin : Microsoft.StylusInput.IStylusAsyncPlugin
{
// ...
// Called when a system gesture occurs.
public void SystemGesture(RealTimeStylus sender, SystemGestureData data)
{
// The following line will cause the realtime stylus that calls this method
// to throw an exception.
sender.Dispose();
}
// ...
}
플러그 인이 RealTimeStylus 개체의 Dispose 메서드를 호출하는 경우 RealTimeStylus 개체는 예외를 throw합니다. 이는 플러그 인이 RealTimeStylus 개체에 의해 호출되는 동안에만 발생합니다.
다음 C# 예제는 RealTimeStylus 개체가 예외를 throw하도록 하는 코드입니다.
using Microsoft.Ink;
using Microsoft.StylusInput;
using Microsoft.StylusInput.PluginData;
// ...
public class thePlugin : Microsoft.StylusInput.IStylusAsyncPlugin
{
Microsoft.StylusInput.GestureRecognizer theGestureRecognizer;
// ...
// Called when a system gesture occurs.
public void SystemGesture(RealTimeStylus sender, SystemGestureData data)
{
// The following line will cause the realtime stylus that calls this method
// to throw an exception.
sender.AsyncPluginCollection.Add(this.theGestureRecognizer);
}
// ...
}
RealTimeStylus 개체를 사용하는 동안 플러그 인 컬렉션을 수정할 수 있습니다. 그러나 이렇게 하면 애플리케이션의 동작을 예측하기가 더 어려워질 수 있습니다. RealTimeStylus 개체를 사용하는 동안 플러그 인이 추가되면 RealTimeStylus 개체는 플러그 인의 IStylusAsyncPlugin.RealTimeStylusEnabled 또는 IStylusSyncPlugin.RealTimeStylusEnabled 메서드를 호출합니다. RealTimeStylus 개체를 사용하는 동안 플러그 인이 제거되면 RealTimeStylus 개체는 플러그 인의 IStylusAsyncPlugin.RealTimeStylusDisabled 또는 IStylusSyncPlugin.RealTimeStylusDisabled 메서드를 호출합니다. 이렇게 하면 플러그 인이 RealTimeStylus 개체의 Enabled 속성을 검사 않고도 적절한 상태를 유지할 수 있습니다.
RealTimeStylus 개체를 사용하는 동안 플러그 인이 추가되면 플러그 인이 수신하는 플러그 인 데이터에 초기 데이터의 컨텍스트를 적절하게 설정하기에 충분한 정보가 포함되지 않을 수 있습니다. 예를 들어 새로 추가된 플러그 인은 스트로크 중간에 있는 펜에서 패킷 데이터를 수신하기 시작할 수 있습니다. 마찬가지로 RealTimeStylus 개체를 사용하는 동안 플러그 인이 제거되면 플러그 인에서 받은 플러그 인 데이터가 데이터 처리를 완료하기에 충분하지 않을 수 있습니다.
참고
전반적인 안정성을 위해 RealTimeStylusEnabled 또는 RealTimeStylusDisabled 메서드가 호출되면 플러그 인의 내부 상태를 다시 설정합니다.
관련 항목