Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Skenery čárových kódů fungují asynchronně, a proto musí informovat aplikace o dostupnosti dat nebo se změnil stav zařízení. Tuto úlohu provedete pomocí delegátů .NET k vyvolání událostí v aplikaci.
Jak je popsáno v tématu o vstupu a událostech zařízení, události se před doručením do aplikace zařadí do fronty. Základní třídy Microsoft Point of Service for .NET (POS pro .NET) poskytují prostředky pro kód objektu služby, který zařadí události do fronty, aby jejich doručení do aplikace bylo možné odložit, dokud je aplikace nebude moct zpracovat. Mezitím může objekt služby pokračovat v čekání na další příchozí hardwarové události.
Zařízení Skener může do aplikace odesílat čtyři události. Pro dvě z těchto událostí DataEvent a ErrorEvent poskytuje POS pro třídu .NET ScannerBase chráněnou pomocnou metodu pro zjednodušení kódu, který je nutný k vyvolání těchto událostí:
| Událost | Metoda, která zařadí událost do fronty |
|---|---|
| DataEvent | Chráněná metoda ScannerBase.GoodRead |
| ErrorEvent | Chráněná metoda ScannerBase.FailedRead |
Dvě další události, DirectIOEvent a StatusUpdateEvent, musí být vyvolány pomocí členů třídy ScannerBasic nižší úrovně. Další informace najdete v tématu Vstup a události zařízení.
Vzhledem k tomu, že zařízení skeneru může do systému kdykoli doručovat data, musí objekt služby skeneru asynchronně čekat na data spuštěním samostatného vlákna čtečky. Události by měly být zařazeny do fronty z tohoto vlákna, protože data přicházejí ze zařízení.
Vyvolání událostí na základě vstupu zařízení
Spusťte vlákno čtečky a počkejte na vstup ze zařízení.
Počkejte na vstup ve vlákně čtečky, nejčastěji pomocí přímých funkcí Win32 ke čtení dat z sběrnice USB.
Po přijetí dat ověřte, že jsou data platná, například že v paketu je dostatek bajtů pro hlavičku a datový typ.
Pokud data nejsou platná, zavolejte Metodu ScannerBase.FailedScan , která zařadí událost ErrorEvent , která bude vyvolána v aplikaci.
Pokud jsou data platná, zavolejte ScannerBase.GoodScan metodu , která zařadí událost DataEvent do fronty, která bude nakonec vyvolána v aplikaci.
Příklad
Jakmile se ze zařízení obdrží vstup, objekt služby zařadí příslušnou událost do fronty. Můžete to udělat tak, že napíšete metodu, například metodu v ukázce v tomto tématu, která by byla volána z vlákna čtenáře objektu služby.
// 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);
}
}
Tuto ukázku nelze zkompilovat samostatně, ale může být vložena do úplné implementace objektu služby skeneru.