Udostępnij przez


Zdarzenia skanera (poS dla zestawu SDK platformy .NET w wersji 1.14)

Skanery kodu słupkowego działają asynchronicznie i dlatego muszą powiadamiać aplikacje, gdy są dostępne dane lub stan urządzenia uległ zmianie. To zadanie wykonuje się przy użyciu delegatów platformy .NET w celu zgłaszania zdarzeń do aplikacji.

Zgodnie z opisem w temacie Dane wejściowe i zdarzenia urządzenia zdarzenia są kolejkowane przed ich dostarczeniem do aplikacji. Klasy bazowe programu Microsoft Point of Service dla platformy .NET (POS dla platformy .NET) zapewniają kod obiektu usługi do kolejkowania zdarzeń, dzięki czemu ich dostarczanie do aplikacji może zostać odroczone do momentu przetworzenia ich przez aplikację. Tymczasem obiekt usługi może nadal czekać na dodatkowe przychodzące zdarzenia sprzętowe.

Urządzenie skanera może wysyłać do aplikacji cztery zdarzenia. W przypadku dwóch z tych zdarzeń, DataEvent i ErrorEvent, klasa POS dla platformy .NET ScannerBase udostępnia chronioną metodę pomocnika, aby uprościć kod wymagany do zgłaszania tych zdarzeń:

Zdarzenie Metoda, która kolejkuje zdarzenie
DataEvent Chroniona metoda ScannerBase.GoodRead
ErrorEvent Protected method ScannerBase.FailedRead

Dwa inne zdarzenia, DirectIOEvent i StatusUpdateEvent, muszą zostać podniesione przy użyciu składowych klasy ScannerBasic niższego poziomu. Aby uzyskać więcej informacji, zobacz Dane wejściowe i zdarzenia urządzenia.

Ponieważ urządzenie skanera może dostarczać dane do systemu w dowolnym momencie, obiekt usługi skanera musi czekać na dane asynchronicznie, uruchamiając oddzielny wątek czytnika. Zdarzenia powinny być umieszczone w kolejce z tego wątku, gdy dane docierają z urządzenia.

Aby zgłaszać zdarzenia na podstawie danych wejściowych urządzenia

  1. Uruchom wątek czytnika, aby czekać na dane wejściowe z urządzenia.

  2. Poczekaj na wejście w wątku czytnika, najczęściej używając funkcji bezpośrednich Win32 do odczytywania danych z magistrali USB.

  3. Po otrzymaniu danych sprawdź, czy dane są prawidłowe, na przykład czy w pakiecie jest wystarczająca liczba bajtów dla nagłówka i typu danych.

  4. Jeśli dane są nieprawidłowe, wywołaj metodę ScannerBase.FailedScan , aby umieścić w kolejce zdarzenie ErrorEvent , które zostanie zgłoszone w aplikacji.

  5. Jeśli dane są prawidłowe, wywołaj metodę ScannerBase.GoodScan , aby w kolejce zdarzenie DataEvent , które ostatecznie zostanie zgłoszone w aplikacji.

Przykład

Gdy tylko dane wejściowe zostaną odebrane z urządzenia, obiekt usługi kolejkuje odpowiednie zdarzenie. Można to zrobić, pisząc metodę, taką jak ta w przykładzie w tym temacie, która będzie wywoływana z wątku czytelnika obiektu usługi.

// 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);
    }
}

Nie można skompilować tego przykładu samodzielnie, ale może zostać wstawiony do pełnej implementacji obiektu usługi skanera.

Zobacz też

Zadania

Pojęcia

Inne zasoby