Подключаемые модули и класс RealTimeStylus
Объект RealTimeStylus предназначен для предоставления доступа к потоку данных в режиме реального времени из пера планшета. Подключаемые модули, объекты, реализующие интерфейс IStylusSyncPlugin или IStylusAsyncPlugin , можно добавить в объект RealTimeStylus . Синхронные подключаемые модули обычно вызываются непосредственно объектом RealTimeStylus в потоке с высоким приоритетом, а асинхронные подключаемые модули обычно вызываются в потоке пользовательского интерфейса приложения. Создание или использование синхронных подключаемых модулей для задач, требующих доступа к потоку данных в режиме реального времени и не требующих вычислений, таких как фильтрация пакетов. Создание или использование асинхронных подключаемых модулей для задач, которым не требуется доступ к потоку данных в режиме реального времени, например сбор рукописного ввода.
Некоторые задачи могут быть ресурсоемкими, но требуют доступа к потоку данных в режиме реального времени, например распознавание жестов с несколькими ударами. Для удовлетворения этих потребностей API StylusInput предоставляют каскадную модель RealTimeStylus , которая позволяет использовать два объекта RealTimeStylus , каждый из которых выполняется в отдельном потоке. Дополнительные сведения о каскадной модели RealTimeStylus см. в разделе Каскадная модель RealTimeStylus.
Интерфейсы IStylusSyncPlugin и IStylusAsyncPlugin определяют одни и те же методы. Эти методы позволяют объекту RealTimeStylus передавать данные пера в каждый подключаемый модуль независимо от того, является ли он асинхронным или синхронным. Свойства Microsoft.StylusInput.IStylusSyncPlugin.DataInterest и Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest позволяют каждому подключаемого модуля подписаться на определенные данные в потоке данных пера планшета. Подключаемый модуль должен подписываться только на данные, необходимые для выполнения задачи, что позволяет свести к минимуму требования к производительности. Дополнительные сведения о потоковой работе и классе RealTimeStylus см. в разделе Вопросы потоков для API StylusInput.
Объект RealTimeStylus использует объекты в пространстве имен Microsoft.StylusInput.PluginData для передачи данных пера в подключаемые модули. RealTimeStylus также перехватывает исключения, создаваемые подключаемыми модулями. Когда RealTimeStylus перехватывает исключения, он уведомляет подключаемые модули, вызывая метод IStylusSyncPlugin.Error или IStylusAsyncPlugin.Error . Дополнительные сведения об использовании данных подключаемого модуля см. в разделе Данные подключаемого модуля и класс RealTimeStylus . Дополнительные сведения об обработке ошибок см. в разделе Рекомендации по обработке ошибок для API StylusInput и в разделе Данные об ошибках статьи Данные подключаемого модуля и класс RealTimeStylus.
Примечание
Перед включением объекта RealTimeStylus необходимо подключить по крайней мере один подключаемый модуль к объекту RealTimeStylus .
В следующих разделах описаны некоторые распространенные категории подключаемых модулей.
- Подключаемые модули коллекции рукописного ввода
- Подключаемые модули динамического отрисовщика
- Подключаемые модули распознавателя
Особые рекомендации
Из-за сложной природы объекта RealTimeStylus следует принять к сведению следующее.
Объект RealTimeStylus создает исключение, если подключаемый модуль изменяет коллекцию подключаемых модулей, к которой он подключен. Это происходит только в том случае, если подключаемый модуль делает это при вызове объектом RealTimeStylus в качестве члена этой коллекции.
В следующем примере C# приведен код, который вызывает исключение в объекте RealTimeStylus .
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. Это происходит только в том случае, если подключаемый модуль делает это при вызове объектом RealTimeStylus .
В следующем примере C# приведен код, который вызывает исключение в объекте RealTimeStylus .
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 . Это позволяет подключаемым модулям поддерживать правильное состояние без необходимости проверка свойство Enabled объекта RealTimeStylus.
При добавлении подключаемого модуля при включенном объекте RealTimeStylus данные подключаемого модуля, получаемые подключаемым модулем, могут не содержать достаточно информации для надлежащего определения контекста исходных данных. Например, только что добавленный подключаемый модуль может начать получать данные пакетов от пера в середине штриха. Аналогичным образом, при удалении подключаемого модуля при включенном объекте RealTimeStylus данные подключаемого модуля, полученные подключаемым модулем, могут оказаться недостаточными для завершения обработки данных.
Примечание
Для общей стабильности сбросьте внутреннее состояние подключаемого модуля при вызове метода RealTimeStylusEnabled или RealTimeStylusDisabled .
Связанные темы