2013-10-11 4 views
1

Motorola EMDK 2.7에서 Symbol.Barcode2 개체를 사용하고 있습니다. 비동기 버퍼 스캔 모드를 사용하고 있습니다.Motorola EMDK - Barcode2를 사용한 스레드 차단 문제 ScanBufferStart 및 ScanBufferStop

symbolBarcode2.ScanBufferStop(); 
:

Barcode2 symbolBarcode2 = new Barcode2(Symbol.Barcode2.Devices.SupportedDevices[0]); 
symbolBarcode2.OnScan +=new Barcode2.OnScanHandler(symbolBarcode2_OnScan); 
symbolBarcode2.ScanBufferStart(); 

나는 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이 호출 될 때 응용 프로그램이 정지된다는 것입니다.

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 

나는 또한 기호 객체에 의해 생성되는 추가 스레드가 있음을 볼 수 있습니다 디버깅 및 호출 스택을 검사하는 WaitOne()에 대한 호출이)합니다 (Symbol.Barcode2.Barcode2.ScanBufferStop 내부에 있음을 보여줍니다 . 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); 하지만 그건 도움이되지 못했습니다.

누구나 버퍼 스캔 모드와 비슷한 경험이 있습니까, 아니면 해결책이있는 일반적인 스레딩/잠금 문제 일 수 있습니까?

감사합니다.

답변

0

버퍼링 모드를 사용해서는 안되는 것처럼 들립니다. 이것은 사용자가 가능한 한 빨리 스캔하고 애플리케이션이 버퍼에서 스캔을 효과적으로 소비하는 시나리오를 위해 만들어졌으며, 각 스캔이 애플리케이션에 의해 수신되고 즉시 유효화되는 IMO보다 일반적인 접근 방식과 반대입니다. 버퍼링 모드에서 사용자는 유효성 검사 루틴보다 2 또는 3 스캔 앞당겨 질 수 있습니다. 이는 분명히 잘 작동하지 않습니다.

는 사실, 버퍼 스캔에 관해서는 SDK의 docos이 발견 :

주의 : 버퍼 스캔 모드는 독서로 진행하기 전에 각 스캔 검증이 필요한 애플리케이션에 적합하지 않을 수 있습니다 다음 바코드.

의 Intsead를 사용하십시오. 아직 비동기이며 버퍼링되지 않았습니다.

+0

.Scan()을 사용하고 매번 이벤트에서 호출하는 것으로 시작했습니다. 유효성 검사의 관점에서 보면 "나쁜"바코드 뒤에 바코드가 스캔되지 않는다는 것을 보장 할 수 있습니다. 그러나 우리는 여전히 사용자가 가능한 한 빨리 스캔하도록하고 싶었습니다. 검증 로직을 1ms 미만으로 최적화했습니다. 나는 Scan 이벤트의 첫 번째 줄로 .Scan()을 호출하기도하고 사용자는 스캐너가 다시 준비 될 때보 다 빨리 트리거를 당길 수 있습니다. 그리고 그들이 너무 일찍 방아쇠를 당기면 레이저가 완전히 풀려서 다시 당겨질 때까지 레이저가 전혀 켜지지 않습니다. – user1536498

+0

일시 중지/이력서 변형을 시도하여 콜백 내에서 더 많이 호출 될 수 있는지 확인 했습니까? – tcarvin

+0

예, 저는 같은 생각을 가지고있었습니다. 또한 스레드가 대기하고 교착 상태가 발생합니다. – user1536498