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.
Leitores de código de barras operam de maneira assíncrona e, portanto, precisam notificar os aplicativos quando dados estão disponíveis ou o estado do dispositivo foi alterado. Você executa essa tarefa usando delegados do .NET para gerar eventos para o aplicativo.
Conforme abordado no tópico Entrada e eventos do dispositivo, os eventos são enfileirados antes de serem entregues ao aplicativo. As classes Base do Ponto de Serviço da Microsoft para .NET (POS para .NET) proporcionam um meio para o código do Objeto de Serviço enfileirar eventos para que a entrega deles o aplicativo possa ser adiada até que o aplicativo possa processá-los. Enquanto isso, o Objeto de Serviço pode continuar aguardando eventos de hardware de entrada adicionais.
O dispositivo Leitor pode enviar quatro eventos para o aplicativo. Para dois desses eventos, DataEvent e ErrorEvent, a classe ScannerBase do POS para .NET fornece um método auxiliar protegido para simplificar o código necessário para gerar esses eventos:
| Evento | Método que enfileira o evento |
|---|---|
| DataEvent | Método protegido ScannerBase.GoodRead |
| ErrorEvent | Método protegido ScannerBase.FailedRead |
Os outros dois eventos, DirectIOEvent e StatusUpdateEvent, devem ser gerados usando membros da classe ScannerBasic de nível inferior. Para saber mais, confira Entrada e eventos do dispositivo.
Como um dispositivo Leitor pode fornecer dados ao sistema a qualquer momento, um Objeto de Serviço Leitor deve aguardar os dados de maneira assíncrona iniciando um thread de leitor separado. Os eventos devem ser enfileirados desse thread à medida que os dados chegam do dispositivo.
Para gerar eventos com base na entrada do dispositivo
Inicie um thread de leitor para aguardar a entrada do dispositivo.
Aguarde a entrada no thread do leitor, mais frequentemente usando funções diretas do Win32 para ler dados do barramento USB.
Depois de receber dados, verifique se eles são válidos, por exemplo, se há bytes suficientes no pacote para o cabeçalho e o tipo de dados.
Se os dados não forem válidos, chame o método ScannerBase.FailedScan para enfileirar um evento ErrorEvent que será gerado no aplicativo.
Se os dados forem válidos, chame o método ScannerBase.GoodScan para enfileirar um evento DataEvent que será gerado no aplicativo.
Exemplo
Assim que a entrada é recebida do dispositivo, o Objeto de Serviço enfileira o evento apropriado. Você pode fazer isso escrevendo um método, como aquele no exemplo neste tópico, que seria chamado do thread de leitor do Objeto de Serviço.
// A Service Object may implement a method such as this one to
// be called from the reader thread of the Service Object.
void OnDataScanned(byte[] data)
{
// Ignore input if process in the Error state. There is no
// need to send an ErrorEvent to the application, because it has
// already been notified by this point.
if (State == ControlState.Error)
{
return;
}
// Make sure that the incoming buffer is large enough to contain
// at least the header and type data.
if ((int)data[1] < 5)
{
// By calling FailedRead, you are queueing an
// ErrorEvent for eventual delivery to the application.
FailedScan();
}
else
{
// The buffer received from the device will be longer
// than we need. Therefore, trim it down. Allocate space for
// the number of bytes contained in data[1], plus one
// more for the first byte in the buffer.
byte[] b = new byte[(int)data[1] + 1];
// Copy the data into a new buffer.
for (int i = 0; i <= (int)data[1]; i++)
{
b[i] = data[i];
}
// By calling GoodScan, you are queueing a DataEvent
// which will delivered to the application when it is suitable.
GoodScan(b);
}
}
Este exemplo não pode ser compilado por conta própria, mas pode ser inserido em uma implementação completa do Objeto de Serviço do Leitor.