1

我在摩托罗拉 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); 但这并没有帮助。

是否有人对缓冲扫描模式有类似的经验,或者可能有解决方案的一般线程/锁定问题?

谢谢

4

1 回答 1

0

在我看来,您不应该使用缓冲扫描模式。它确实适用于用户尽可能快地扫描并且应用程序实际上只是消耗缓冲区中的扫描的情况,而不是 IMO 更常见的方法,即每次扫描都由应用程序接收并立即验证。在缓冲模式下,用户可能比您的验证程序提前 2 或 3 次扫描,这显然效果不佳。

事实上,我在 SDK docos 中发现了关于缓冲扫描的内容:

注意:缓冲扫描模式可能不适合那些需要在继续读取下一个条形码之前验证每次扫描的应用程序。

symbolBarcode2.ScanBufferStart()使用symbolBarcode2.Scan(). _ 它仍然是异步的,只是没有缓冲。

于 2013-10-14T14:12:29.767 回答