Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los escáneres de códigos de barras funcionan de forma asincrónica y, por lo tanto, tienen que notificar a las aplicaciones cuando están disponibles los datos o cuando ha cambiado el estado del dispositivo. Para realizar esta tarea, use delegados de .NET para generar eventos para la aplicación.
Como se describe en el tema Entrada y eventos de dispositivo (documentación del SDK de POS para .NET v1.14), los eventos se ponen en cola antes de entregarlos a la aplicación. Las clases base de Microsoft Point of Service para .NET (POS para .NET) proporcionan un medio para que el código del objeto de servicio ponga en cola los eventos para que su entrega a la aplicación se pueda aplazar hasta que la aplicación pueda procesarlos. Mientras tanto, el objeto de servicio puede seguir esperando eventos de hardware entrantes adicionales.
El dispositivo escáner puede enviar cuatro eventos a la aplicación. Para dos de estos eventos, DataEvent y ErrorEvent, la clase ScannerBase de POS para .NET proporciona un método auxiliar protegido para simplificar el código necesario para generar estos eventos:
| Evento | Método que pone en cola el evento |
|---|---|
| DataEvent | Método protegido ScannerBase.GoodRead |
| ErrorEvent | Método protegido ScannerBase.FailedRead |
Los otros dos eventos, DirectIOEvent y StatusUpdateEvent, se deben generar mediante el uso de miembros de la clase ScannerBasic de nivel inferior. Para obtener más información, consulte Entrada y eventos de dispositivo (documentación del SDK de POS para .NET v1.14).
Dado que un dispositivo escáner puede entregar datos al sistema en cualquier momento, un objeto de servicio de escáner debe esperar los datos de forma asincrónica iniciando un subproceso de lector independiente. Los eventos se deben poner en cola desde este subproceso a medida que llegan los datos desde el dispositivo.
Para generar eventos basados en la entrada del dispositivo
Inicie un subproceso de lector para esperar la entrada desde el dispositivo.
Espere la entrada en el subproceso de lector, habitualmente mediante funciones directas de Win32 para leer datos del bus USB.
Después de recibir los datos, compruebe que los datos sean válidos, por ejemplo, que haya suficientes bytes en el paquete para el encabezado y el tipo de datos.
Si los datos no son válidos, llame al método ScannerBase.FailedScan para poner en cola un evento ErrorEvent que se generará en la aplicación.
Si los datos son válidos, llame al método ScannerBase.GoodScan para poner en cola un evento DataEvent que finalmente se generará en la aplicación.
Ejemplo
Tan pronto como se reciba la entrada del dispositivo, el objeto de servicio pone en cola el evento adecuado. Para ello, escriba un método, como el del ejemplo de este tema, al que se llamará desde el subproceso de lector del objeto de servicio.
// 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 ejemplo no se puede compilar por sí solo, pero se puede insertar en una implementación completa del objeto de servicio del escáner.
Consulte también
Tareas
Conceptos
- Método DirectIO de clase base (documentación del SDK de POS para .NET v1.14)
- Entrada y eventos de dispositivo (documentación del SDK de POS para .NET v1.14)