Plug-Ins und die RealTimeStylus-Klasse

Das RealTimeStylus-Objekt ist für den Echtzeitzugriff auf den Datenstrom über den Tablettstift konzipiert. Plug-Ins, Objekte, die die IStylusSyncPlugin- oder IStylusAsyncPlugin-Schnittstelle implementieren, können einem RealTimeStylus-Objekt hinzugefügt werden. Synchrone Plug-Ins werden im Allgemeinen direkt vom RealTimeStylus-Objekt in einem Thread mit hoher Priorität aufgerufen, während asynchrone Plug-Ins im Allgemeinen im Ui-Thread der Anwendung aufgerufen werden. Erstellen oder verwenden Sie synchrone Plug-Ins für Aufgaben, die Echtzeitzugriff auf den Datenstrom erfordern und berechnungsbasiertes Undemanding durchführen, z. B. Paketfilterung. Erstellen oder verwenden Sie asynchrone Plug-Ins für Aufgaben, die keinen Echtzeitzugriff auf den Datenstrom erfordern, z. B. die Sammlung von Ink-Daten.

Bestimmte Aufgaben können rechenintensiv sein, erfordern jedoch Echtzeitzugriff auf den Datenstrom, z. B. die Erkennung von Multistrokegesten. Um diese Anforderungen zu erfüllen, bieten die StylusInput-APIs ein kaskadiertes RealTimeStylus-Modell, mit dem Sie zwei RealTimeStylus-Objekte verwenden können, die jeweils in einem eigenen Thread ausgeführt werden. Weitere Informationen zum kaskadierten RealTimeStylus-Modell finden Sie unter Das kaskadierte RealTimeStylus-Modell.

Sowohl die Schnittstellen IStylusSyncPlugin als auch IStylusAsyncPlugin definieren die gleichen Methoden. Mit diesen Methoden kann das RealTimeStylus-Objekt die Stiftdaten an jedes Plug-In übergeben, unabhängig davon, ob es sich um ein asynchrones oder synchrones Plug-In handelt. Mit den Eigenschaften Microsoft.StylusInput.IStylusSyncPlugin.DataInterest und Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest kann jedes Plug-In bestimmte Daten im Tablettstiftdatenstrom abonnieren. Ein Plug-In sollte nur die Daten abonnieren, die zum Ausführen seiner Aufgabe erforderlich sind, wodurch die Leistungsanforderungen minimiert werden. Weitere Informationen zum Threading und zur RealTimeStylus-Klasse finden Sie unter Überlegungen zum Threading für die StylusInput-APIs.

Das RealTimeStylus-Objekt verwendet Objekte im Microsoft.StylusInput.PluginData-Namespace, um die Stiftdaten an die Plug-Ins zu übergeben. Der RealTimeStylus fängt auch Ausnahmen ab, die von Plug-Ins ausgelöst werden. Wenn RealTimeStylus Ausnahmen abfängt, benachrichtigt er die Plug-Ins durch Aufrufen der IStylusSyncPlugin.Error- oder IStylusAsyncPlugin.Error-Methode. Weitere Informationen zur Verwendung von Plug-In-Daten finden Sie unter Plug-In-Daten und die RealTimeStylus-Klasse. Weitere Informationen zur Fehlerbehandlung finden Sie unter Überlegungen zur Fehlerbehandlung für die StylusInput-APIs und im Abschnitt Fehlerdaten von Plug-In-Daten und der RealTimeStylus-Klasse.

Hinweis

Mindestens ein Plug-In muss an das RealTimeStylus-Objekt angefügt werden, bevor das RealTimeStylus-Objekt aktiviert werden kann.

In den folgenden Themen werden einige allgemeine Kategorien von Plug-Ins beschrieben.

Besondere Überlegungen

Aufgrund der Komplexität des RealTimeStylus-Objekts sollten Sie Folgendes beachten.

Das RealTimeStylus-Objekt löst eine Ausnahme aus, wenn ein Plug-In die Plug-In-Auflistung ändert, an die es angefügt ist. Dies geschieht nur, wenn das Plug-In dies tut, während es vom RealTimeStylus-Objekt als Member dieser Auflistung aufgerufen wird.

Das folgende # C-Beispiel ist Code, der bewirkt, dass das RealTimeStylus-Objekt eine Ausnahme auslöst.

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();
    }
    
    // ...
}

Das RealTimeStylus-Objekt löst eine Ausnahme aus, wenn ein Plug-In die Dispose-Methode des RealTimeStylus-Objekts aufruft. Dies geschieht nur, wenn das Plug-In dies tut, während es vom RealTimeStylus-Objekt aufgerufen wird.

Das folgende # C-Beispiel ist Code, der bewirkt, dass das RealTimeStylus-Objekt eine Ausnahme auslöst.

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);
    }
    
    // ...
}

Plug-In-Sammlungen können geändert werden, während das RealTimeStylus-Objekt aktiviert ist. Dies kann jedoch die Vorhersage des Verhaltens Ihrer Anwendung erschweren. Wenn ein Plug-In hinzugefügt wird, während das RealTimeStylus-Objekt aktiviert ist, ruft das RealTimeStylus-Objekt die IStylusAsyncPlugin.RealTimeStylusEnabled- oder IStylusSyncPlugin.RealTimeStylusEnabled-Methode des Plug-Ins auf. Wenn ein Plug-In entfernt wird, während das RealTimeStylus-Objekt aktiviert ist, ruft das RealTimeStylus-Objekt die IStylusAsyncPlugin.RealTimeStylusDisabled- oder IStylusSyncPlugin.RealTimeStylusDisabled-Methode des Plug-Ins auf. Dadurch kann das Plug-In seinen richtigen Zustand erhalten, ohne die Enabled-Eigenschaft des RealTimeStylus-Objekts überprüfen zu müssen.

Wenn ein Plug-In hinzugefügt wird, während das RealTimeStylus-Objekt aktiviert ist, enthalten die plug-in-Daten, die das Plug-In empfängt, möglicherweise nicht genügend Informationen, um den Kontext der ursprünglichen Daten angemessen zu erstellen. Das neu hinzugefügte Plug-In könnte z. B. beginnen, Paketdaten von einem Stift mit Strichmitte zu empfangen. Wenn ein Plug-In entfernt wird, während das RealTimeStylus-Objekt aktiviert ist, sind die vom Plug-In empfangenen Plug-In-Daten möglicherweise nicht ausreichend, um die Verarbeitung der Daten fertig zu stellen.

Hinweis

Setzen Sie den internen Zustand eines Plug-Ins zurück, wenn entweder seine RealTimeStylusEnabled- oder RealTimeStylusDisabled-Methode aufgerufen wird.

Das kaskadierte RealTimeStylus-Modell

Überlegungen zur Fehlerbehandlung für die StylusInput-APIs

Plug-In-Daten und die RealTimeStylus-Klasse

Überlegungen zum Threading für die StylusInput-APIs