Compartilhar via


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.

 

O modelo Cascaded RealTimeStylus

Considerações sobre tratamento de erros para as APIs stylusInput

Dados de plug-in e a classe RealTimeStylus

Considerações sobre threading para as APIs stylusInput