Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O gerenciamento de eventos representa um dos principais aspetos dos aplicativos de programação para o Microsoft Point of Service for .NET (POS for .NET). Todas as entradas no sistema POS para .NET são controladas por eventos e cada segmento da arquitetura POS para .NET usa eventos para se comunicar com outros aplicativos e objetos de serviço.
Modelo de processamento controlado por eventos
A entrada orientada por eventos começa quando um dispositivo POS conectado recebe entrada de dados. Se esse dispositivo estiver habilitado (a DeviceEnabled propriedade está 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 "primeiro a entrar, primeiro a sair" por um thread de serviço interno. Imediatamente antes desse 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 se desativará automaticamente (definindo a propriedade DeviceEnabled como false) se a propriedade AutoDisable estiver definida como true. Enquanto estiver desativado, o dispositivo não pode enfileirar novas entradas e o dispositivo físico será desativado, se possível.
Quando o aplicativo está pronto para receber entrada do dispositivo, ele define a propriedade DataEventEnabled como true. Em seguida, o aplicativo começa a receber eventos DataEvent enfileirados, 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 FreezeEvents propriedade 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 mais dados, ele poderá reativar eventos definindo a propriedade DataEventEnabled como true.
Entrada orientada a eventos e compartilhamento de dispositivos
Se o dispositivo de entrada for um dispositivo de uso exclusivo, o aplicativo deve reivindicar 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 que ele o use para ler a entrada. Um aplicativo deve chamar o método Claim para solicitar acesso exclusivo ao dispositivo antes que o Service Object envie dados para ele usando DataEvent. Se a entrada controlada por eventos for recebida, mas o dispositivo permanecer não reivindicado, a entrada será armazenada em buffer até que um aplicativo declare 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 orientada a eventos e tratamento de erros
O dispositivo entra em um estado de erro se um erro for encontrado ao receber a entrada controlada por eventos. Em seguida, ele enfileira um evento ErrorEvent (que contém InputData ou InputErrorEvent loci). 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 limpando a entrada ou notificando o usuário sobre o erro. Em seguida, conclua o processamento da entrada em buffer.
- Entrada – Usada 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. Finalmente, um ErrorEvent com o valor 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 pode sair do estado de erro quando ocorre uma das seguintes situações:
- 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 orientada a eventos. Depois que a entrada é recebida pelo objeto de serviço, normalmente nenhuma entrada adicional será recebida até que o método seja chamado novamente. Exemplos de dispositivos que usam essa variação de entrada orientada a eventos, também conhecida como entrada assíncrona, incluem o reconhecimento de caracteres de tinta magnética (MICR) e 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 Reivindicação para dispositivos de uso exclusivo ou Aberto 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 orientada a eventos, também conhecida como entrada síncrona, é o dispositivo Keylock .
Event Types
O POS para .NET implementa eventos de Ponto de Serviço Unificado (UnifiedPOS) como eventos .NET padrão com delegados de multicast. Os eventos informam um aplicativo sobre 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 pelo aplicativo é necessária para processar a condição de erro. |
| StatusUpdateEvent | Um evento gerado pelo objeto de serviço para alertar o aplicativo 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 enfileirada 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 e gerenciada internamente. Os eventos são entregues de maneira "primeiro a entrar, primeiro a sair" e são entregues por um thread de serviço interno.
As seguintes condições fazem com que a entrega do evento seja atrasada até que a condição seja corrigida:
- O aplicativo definiu a propriedade FreezeEvents como true. A propriedade FreezeEvents permite que os 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 filas de eventos são as seguintes:
- O dispositivo só pode enfileirar novos eventos enquanto o dispositivo estiver ativado.
- O dispositivo entrega eventos em fila 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 insere DeviceErrorEvents (ErrorLocus = Input ou InputData).
- O método ClearOutput limpa a saída DeviceErrorEvents (ErrorLocus = Output).