Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les scanneurs de codes-barres fonctionnent de manière asynchrone et doivent donc notifier les applications lorsque des données sont disponibles ou que l’état de l’appareil a changé. Vous effectuez cette tâche à l’aide de délégués .NET pour déclencher des événements dans l’application.
Comme indiqué dans la rubrique Entrée d’appareil et événements, les événements sont mis en file d’attente avant d’être remis à l’application. Les classes de base Microsoft Point of Service pour .NET (POS pour .NET) permettent au code objet de service de mettre en file d’attente les événements afin que leur remise à l’application puisse être différée jusqu’à ce que l’application puisse les traiter. Pendant ce temps, l’objet de service peut continuer à attendre des événements matériels entrants supplémentaires.
L’appareil Scanneur peut envoyer quatre événements à l’application. Pour deux de ces événements, DataEvent et ErrorEvent, la classe POS pour .NET ScannerBase fournit une méthode d’assistance protégée pour simplifier le code requis pour déclencher ces événements :
| Événement | Méthode qui met en file d’attente l’événement |
|---|---|
| DataEvent | Méthode protégée ScannerBase.GoodRead |
| ErrorEvent | Méthode protégée ScannerBase.FailedRead |
Les deux autres événements, DirectIOEvent et StatusUpdateEvent, doivent être déclenchés à l’aide des membres de la classe ScannerBasic de niveau inférieur. Pour plus d’informations, consultez Entrée d’appareil et événements.
Étant donné qu’un appareil Scanneur peut remettre des données au système à tout moment, un objet de service Scanneur doit attendre les données de manière asynchrone en démarrant un thread de lecteur distinct. Les événements doivent être mis en file d’attente à partir de ce thread à mesure que les données arrivent de l’appareil.
Pour déclencher des événements en fonction de l’entrée de l’appareil
Démarrez un thread de lecteur pour attendre l’entrée de l’appareil.
Attendez l’entrée sur le thread de lecteur, le plus fréquemment à l’aide des fonctions directes Win32 pour lire les données du bus USB.
Après avoir reçu des données, vérifiez que les données sont valides, par exemple, qu’il y a suffisamment d’octets dans le paquet pour l’en-tête et le type de données.
Si les données ne sont pas valides, appelez la méthode ScannerBase.FailedScan pour mettre en file d’attente un événement ErrorEvent qui sera déclenché dans l’application.
Si les données sont valides, appelez la méthode ScannerBase.GoodScan pour mettre en file d’attente un événement DataEvent qui sera déclenché dans l’application.
Exemple
Dès que l’entrée est reçue de l’appareil, l’objet de service met en file d’attente l’événement approprié. Pour ce faire, vous pouvez écrire une méthode, telle que celle de l’exemple de cette rubrique qui serait appelée à partir du thread de lecteur de l’objet de service.
// 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);
}
}
Cet exemple ne peut pas être compilé seul, mais peut être inséré dans une implémentation complète d’objet de service Scanneur.