我在摩托罗拉EMDK 2.7中使用Symbol.Barcode2对象。 我正在使用异步缓冲扫描模式。 下面是一些示例代码,用于附加要为每个扫描事件调用的委托,然后在异步缓冲区模式下启动扫描程序:
Barcode2 symbolBarcode2 = new Barcode2(Symbol.Barcode2.Devices.SupportedDevices[0]);
symbolBarcode2.OnScan +=new Barcode2.OnScanHandler(symbolBarcode2_OnScan);
symbolBarcode2.ScanBufferStart();
为了停止扫描仪,我调用 ScanBufferStop 方法:
symbolBarcode2.ScanBufferStop();
我在两种情况下使用 ScanBufferStop:
首先,在处理数据时,我想停止扫描仪并提醒用户。 例:
private void symbolReader_OnScan(ScanDataCollection scancollection)
{
if (scancollection.GetFirst.Text == "0000000000")
{
// Turn off scanner and alert user
symbolBarcode2.ScanBufferStop();
}
else
{
// Process data and wait for next scan
}
}
其次,当应用程序关闭时。
我的问题是,当调用ScanBufferStop时,应用程序冻结。 调试和检查调用堆栈显示,在 Symbol.Barcode2.Barcode2.ScanBufferStop(( 中有一个对 WaitOne(( 的调用:
mscorlib.dll!System.PInvoke.PAL.Threading_Event_Wait(System.IntPtr handle = 1245201)
mscorlib.dll!System.Threading.EventWaitHandle.WaitOne() + 0x7 bytes
Symbol.Barcode2.dll!Symbol.Barcode2.Barcode2.ScanBufferStop() + 0x43 bytes
我还可以看到 Symbol 对象正在创建其他线程。 我认为正在发生的事情是 ScanBufferStop(( 正在检查另一个线程是否正在访问 Barcode2 对象,如果是,则调用 WaitOne。 但是当我从委托中的同一线程调用它时,它会导致死锁情况。
在第一个场景中,我能够通过创建自己的新线程来绕过它,该线程从委托调用 ScannBufferStop:
private void symbolReader_OnScan(ScanDataCollection scancollection)
{
if (scancollection.GetFirst.Text == "0000000000")
{
// Turn off scanner and alert user
//symbolBarcode2.ScanBufferStop();
System.Threading.Thread t = new System.Threading.Thread(StopDelegate);
t.Start();
}
else
{
// Process data and wait for next scan
}
}
internal void StopDelegate()
{
symbolBarcode2.ScanBufferStop();
}
但是当应用程序退出时,我仍然遇到死锁问题。 我尝试使用相同的技术从不同的线程调用 ScanBufferStop,但它仍然以一个线程挂起并调用 WaitOne(( 结束。
我也试过打电话 System.Threading.Thread.Sleep(0(;但这无济于事。
是否有人在缓冲扫描模式方面有任何类似的经验,或者可能有解决方案的一般线程/锁定问题?
谢谢
在我看来,您不应该使用缓冲扫描模式。 它实际上适用于以下情况:用户尽可能快地扫描,并且应用程序实际上只是使用缓冲区中的扫描,而不是IMO更常见的方法,其中每个扫描都由应用程序接收并立即验证。 在缓冲模式下,用户可能会比验证例程提前 2 或 3 次扫描,这显然效果不佳。
事实上,我在 SDK 文档中发现了关于缓冲扫描的内容:
注意:缓冲扫描模式可能不适合那些 在继续之前需要验证每个扫描的应用程序 读取下一个条形码。
symbolBarcode2.ScanBufferStart()
使用symbolBarcode2.Scan()
的内在 . 它仍然是异步的,只是没有缓冲。