Plug-ins e a classe RealTimeStylus
O objeto RealTimeStylus foi projetado para fornecer acesso em tempo real ao fluxo de dados da caneta tablet. Plug-ins, objetos que implementam a interface IStylusSyncPlugin ou IStylusAsyncPlugin , podem ser adicionados a um objeto RealTimeStylus . Plug-ins síncronos geralmente são chamados diretamente pelo objeto RealTimeStylus em um thread de alta prioridade, enquanto plug-ins assíncronos geralmente são chamados no thread da interface do usuário do aplicativo. Crie ou use plug-ins síncronos para tarefas que exigem acesso em tempo real ao fluxo de dados e não gerenciam computacionalmente, como filtragem de pacotes. Crie ou use plug-ins assíncronos para tarefas que não exigem acesso em tempo real ao fluxo de dados, como a coleta de tinta.
Determinadas tarefas podem exigir computacionalmente, mas exigem acesso em tempo real ao fluxo de dados, como o reconhecimento de gestos multissessão. Para atender a essas necessidades, as APIs StylusInput fornecem um modelo RealTimeStylus em cascata que permite usar dois objetos RealTimeStylus , cada um em execução em seu próprio thread. Para obter mais informações sobre o modelo RealTimeStylus em cascata, consulte The Cascaded RealTimeStylus Model.
As interfaces IStylusSyncPlugin e IStylusAsyncPlugin definem os mesmos métodos. Esses métodos permitem que o objeto RealTimeStylus passe os dados da caneta para cada plug-in, independentemente de ser um plug-in assíncrono ou síncrono. As propriedades Microsoft.StylusInput.IStylusSyncPlugin.DataInterest e Microsoft.StylusInput.IStylusAsyncPlugin.DataInterest permitem que cada plug-in assine dados específicos no fluxo de dados da caneta tablet. Um plug-in só deve assinar os dados necessários para executar sua tarefa, minimizando as demandas de desempenho. Para obter mais informações sobre threading e a classe RealTimeStylus , consulte Considerações de threading para as APIs StylusInput.
O objeto RealTimeStylus usa objetos no namespace Microsoft.StylusInput.PluginData para passar os dados da caneta para seus plug-ins. O RealTimeStylus também captura exceções geradas por plug-ins. Quando o RealTimeStylus captura exceções, ele notifica os plug-ins chamando o método IStylusSyncPlugin.Error ou IStylusAsyncPlugin.Error . Para obter mais informações sobre como usar dados de plug-in, consulte Dados de plug-in e a classe RealTimeStylus . Para obter mais informações sobre tratamento de erros, consulte Considerações sobre tratamento de erros para as APIs StylusInput e a seção Dados de Erro de Dados de Plug-in e a Classe RealTimeStylus.
Observação
Pelo menos um plug-in deve ser anexado ao objeto RealTimeStylus antes que o objeto RealTimeStylus possa ser habilitado.
Os tópicos a seguir descrevem algumas categorias comuns de plug-ins.
Considerações especiais
Devido à natureza complexa do objeto RealTimeStylus , você deve tomar nota do seguinte.
O objeto RealTimeStylus gera uma exceção se um plug-in modifica a coleção de plug-in à qual está anexado. Isso acontece somente quando o plug-in faz isso enquanto está sendo chamado pelo objeto RealTimeStylus como um membro dessa coleção.
O exemplo de C# a seguir é o código que faz com que o objeto RealTimeStylus gere uma exceção.
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();
}
// ...
}
O objeto RealTimeStylus gerará uma exceção se um plug-in chamar o método Dispose do objeto RealTimeStylus. Isso acontece somente quando o plug-in faz isso enquanto está sendo chamado pelo objeto RealTimeStylus .
O exemplo de C# a seguir é o código que faz com que o objeto RealTimeStylus gere uma exceção.
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);
}
// ...
}
As coleções de plug-in podem ser modificadas enquanto o objeto RealTimeStylus está habilitado; no entanto, isso pode dificultar a previsão do comportamento do aplicativo. Quando um plug-in é adicionado enquanto o objeto RealTimeStylus está habilitado, o objeto RealTimeStylus chama o método IStylusAsyncPlugin.RealTimeStylusEnabled ou IStylusSyncPlugin.RealTimeStylusEnabled do plug-in. Quando um plug-in é removido enquanto o objeto RealTimeStylus está habilitado, o objeto RealTimeStylus chama o método IStylusAsyncPlugin.RealTimeStylusDisabled ou IStylusSyncPlugin.RealTimeStylusDisabled do plug-in. Isso permite que o plug-in mantenha seu estado adequado sem precisar marcar a propriedade Enabled do objeto RealTimeStylus.
Quando um plug-in é adicionado enquanto o objeto RealTimeStylus está habilitado, os dados de plug-in que o plug-in recebe podem não conter informações suficientes para estabelecer adequadamente o contexto dos dados iniciais. Por exemplo, o plug-in recém-adicionado pode começar a receber dados de pacote de uma caneta que é de traço médio. Da mesma forma, quando um plug-in é removido enquanto o objeto RealTimeStylus está habilitado, os dados de plug-in que o plug-in recebeu podem ser insuficientes para concluir o processamento dos dados.
Observação
Para estabilidade geral, redefina o estado interno de um plug-in quando o método RealTimeStylusEnabled ou RealTimeStylusDisabled for chamado.
Tópicos relacionados