Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O gerenciamento de eventos representa um dos principais aspectos dos aplicativos de programação para o Ponto de Serviço da Microsoft para .NET (POS para .NET). Toda entrada no sistema do POS para .NET é controlada por eventos e cada segmento da Arquitetura do POS para .NET usa eventos para se comunicar com os outros aplicativos e objetos de serviço.
Modelo de processamento controlado por eventos
A entrada controlada por eventos começa quando um dispositivo POS anexado recebe entrada de dados. Se esse dispositivo estiver habilitado (a propriedade DeviceEnabled for definida como true), os dados recebidos serão enfileirados como um evento DataEvent e enviados para o aplicativo. Os eventos são entregues de maneira inicial e inicial por um thread de serviço interno. Pouco antes de esse evento ser gerado, um Objeto de Serviço pode usar o método PreFireEvent para atualizar as propriedades antes que esse evento seja enviado.
Depois que os dados do evento forem recebidos, o dispositivo será automaticamente desabilitado (definindo a propriedade DeviceEnabled como false) se a propriedade AutoDisable for definida como true. Enquanto estiver desabilitado, o dispositivo não pode enfileirar nova entrada e o dispositivo físico será desabilitado, se possível.
Quando o aplicativo estiver pronto para receber a entrada do dispositivo, ele definirá a propriedade DataEventEnabled como true. Em seguida, o aplicativo começa a receber eventos DataEvent na fila, mesmo que esses eventos DataEvent tenham sido enfileirados antes da propriedade DataEventEnabled ser definida como true.
Eventos de dados adicionais podem ser desabilitados definindo a propriedade DataEventEnabled ou a propriedade FreezeEvents como false. Isso faz com que os dados de entrada posteriores sejam enfileirados enquanto o aplicativo processa a entrada atual e as propriedades associadas. Quando o aplicativo estiver pronto para obter mais dados, ele poderá reabilitar eventos definindo a propriedade DataEventEnabled como true.
Entrada controlada por eventos e compartilhamento de dispositivos
Se o dispositivo de entrada for um dispositivo de uso exclusivo, o aplicativo deverá solicitar e habilitar o dispositivo antes de usá-lo para ler a entrada.
Se o dispositivo for compartilhável, um ou mais aplicativos deverão abrir e habilitar o dispositivo antes de usá-lo para ler a entrada. Um aplicativo deve chamar o método Claim para solicitar acesso exclusivo ao dispositivo antes que o Objeto de Serviço envie dados a ele usando DataEvent. Se a entrada controlada por eventos for recebida, mas o dispositivo permanecer não direcionado, a entrada será armazenada em buffer até que um aplicativo declara o dispositivo e a propriedade DataEventEnabled seja definida como true. Esse comportamento promove o compartilhamento ordenado do dispositivo entre vários aplicativos, passando efetivamente o foco de entrada entre eles.
Entrada controlada por eventos e tratamento de erros
O dispositivo entrará em um estado de erro se um erro for encontrado ao receber entrada controlada por eventos. Em seguida, ele enfileira um evento ErrorEvent (que contém o loci InputData ou InputErrorEvent). Esses eventos não são entregues até que a propriedade DataEventEnabled seja definida como true para garantir o sequenciamento ordenado do aplicativo. Cada ErrorEvent indica qual dos dois possíveis loci de erro é responsável:
- InputData – Usado se o erro ocorreu enquanto um ou mais eventos DataEvent estão na fila. O ErrorEvent salta para o cabeçalho da fila de eventos para tratamento imediato para que o aplicativo possa responder imediatamente desmarcando a entrada ou notificando o usuário sobre o erro. Em seguida, conclua o processamento da entrada em buffer.
- Entrada – Usado se ocorreu um erro e nenhum dado está disponível. Se os dados de entrada já estiverem na fila quando o erro ocorrer, um ErrorEvent com o locus InputData será enfileirado e entregue primeiro, em seguida, os DataEvents restantes na fila serão gerados e manipulados. Por fim, um ErrorEvent com o valor de Input é enviado para indicar que a fila está vazia e nenhum dado está disponível. É significativo observar que, se um ErrorEvent com o valor InputData foi entregue e o manipulador de eventos do aplicativo respondeu com um valor Clear, esse InputDataErrorEvent não será entregue. Normalmente, esse erro é inserido no final da fila de eventos.
O dispositivo poderá sair do estado erro quando ocorrer um dos seguintes procedimentos:
- O aplicativo retorna do InputErrorEvent. O aplicativo retorna do InputDataErrorEvent com um valor Clear para a propriedade ErrorResponse.
- O aplicativo chama o método ClearInput.
Para alguns dispositivos, o aplicativo deve chamar um método para iniciar a entrada controlada por eventos. Depois que a entrada for recebida pelo Objeto de Serviço, normalmente nenhuma entrada adicional será recebida até que o método seja chamado novamente. Exemplos para dispositivos que usam essa variação de entrada controlada por eventos, também conhecida como entrada assíncrona, incluem o MICR (reconhecimento de caracteres de tinta magnética) e os dispositivos de Captura de Assinatura. A propriedade DataCount pode ser lida para obter o número de eventos DataEvent na fila.
Todas as entradas na fila podem ser excluídas chamando o método ClearInput. ClearInput pode ser chamado após Claim para dispositivos de uso exclusivo ou Open para dispositivos compartilháveis.
O modelo de entrada geral controlado por eventos não impede a definição de classes de dispositivo que contêm métodos ou propriedades que retornam dados de entrada diretamente. Um exemplo dessa variação de entrada controlada por eventos, também conhecida como entrada síncrona, é o dispositivo Keylock.
Tipos de eventos
O POS para .NET implementa eventos UnifiedPOS (Unified Point Of Service) como eventos padrão do .NET com delegados multicast. Os eventos informam a um aplicativo de várias atividades ou alterações com um dispositivo, como quando um dispositivo é adicionado ou removido. A tabela a seguir lista os tipos de evento.
Evento | Descrição |
---|---|
DataEvent | Um evento gerado pelo Objeto de Serviço para notificar o aplicativo de que os dados de entrada estão disponíveis. |
ErrorEvent | Um evento gerado pelo Objeto de Serviço para notificar o aplicativo de que ocorreu um erro de dispositivo e que uma resposta adequada do aplicativo é necessária para processar a condição de erro. |
StatusUpdateEvent | Um evento gerado pelo Objeto de Serviço para alertar a aplicação de uma alteração de status do dispositivo. |
OutputCompleteEvent | Um evento gerado pelo Objeto de Serviço para notificar o aplicativo de que a solicitação de saída na fila foi concluída com êxito. |
DirectIOEvent | Um evento gerado pelo Objeto de Serviço para comunicar informações diretamente ao aplicativo. |
O Objeto de Serviço deve empilhar esses eventos em uma fila criada internamente e gerenciada. Os eventos são entregues de maneira inicial e inicial e são entregues por um thread de serviço interno.
As seguintes condições fazem com que a entrega de eventos seja atrasada até que a condição seja corrigida:
- O aplicativo definiu a propriedade FreezeEvents como true. A propriedade FreezeEvents permite que eventos sejam enfileirados, mas impede sua entrega até que FreezeEvents seja definido como false.
- O evento é um DataEvent ou um ErrorEvent de entrada, mas a propriedade DataEventEnabled é false.
As regras para o gerenciamento de fila de eventos são as seguintes:
- O dispositivo só poderá enfileirar novos eventos enquanto o dispositivo estiver habilitado.
- O dispositivo fornece eventos enfileirados até que o aplicativo chame o método Close ou, para dispositivos de uso exclusivo, o método Release. Quando esses métodos são chamados, todos os eventos restantes na fila são excluídos.
- O método ClearInput limpa DataEvents e DeviceErrorEvents de entrada (ErrorLocus = Input ou InputData).
- O método ClearOutput limpa a saída DeviceErrorEvents (ErrorLocus = Output).