2015-03-03 33 views
0

我有一個C#代碼,它捕獲設備中的指紋。捕獲代碼是用C++ dll編寫的,它通過並行回調來返回圖像以提供實時視圖。但問題是應用程序在捕獲過程中的一段時間後會停止工作。這是因爲只有回調方法。如果我在回調方法中註釋代碼,它工作正常。 我想知道如果回調方法可以放在另一個線程,以便未來的圖像不會在回調方法中崩潰。 以下是我稱呼該方法的方式。在不同的線程中運行回調

/* c# code: */ 

    [DllImport("abc.dll", EntryPoint = "capture", CharSet = CharSet.Auto, ExactSpelling = false, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I4)] 
    static extern int capture(callback liveImageCallback); 

    private delegate void callback(IntPtr img); 

    void capture() 
    { 
     int ret= capture(callBackLiveImage); 
    } 

    public void callBackLiveImage(IntPtr imgPointer) 
    { 
     byte[] rawData = new byte[102400]; 
     Marshal.Copy(imgPointer, rawData, 0, 102400); 
    } 

    /* c++ code: */ 

    typedef void (__stdcall * Callback)(unsigned char* img); 
    Callback LiveImageHandler; 

    void capture(liveCallback) 
    { 
     LiveImageHandler = liveCallback; 
     someMethod(); 
    } 

    someMethod() 
    { 
     LiveImageHandler(raw_img); 
    } 
+0

您確定回調方法「contents」沒有失敗,即Try >> Catch?嘗試{int ret = capture(callBackLiveImage); } catch {} – 2015-03-03 07:06:41

+0

絕對看起來像「XY問題」,在這種情況下,我真的不知道如何在不同線程中運行回調來解決問題。你應該專注於找出回調失敗的原因並解決這個問題。 – 2015-03-03 08:17:48

+0

請再描述一下「停止工作」是什麼意思。它如何停止工作? – 2015-03-03 09:14:06

回答

1

您在callBackLiveImage方法中沒有錯誤處理。你總是複製102400。我的非管理意識是看到一個未處理的異常,如AccessViolationException等。

嘗試使用try - catch語句來捕獲異常,並將其記錄:

public void callBackLiveImage(IntPtr imgPointer) 
{ 
    try 
    { 
    byte[] rawData = new byte[102400]; 
    Marshal.Copy(imgPointer, rawData, 0, 102400); 
    } 
    catch (Exception ex) 
    { 
    Debug.WriteLine(ex.ToString()); 
    } 
} 

非託管代碼中未處理的.NET異常並不真正聽起來像一個好主意:)

的特定的異常會讓你更好地瞭解你正在處理的事情。可能是因爲imgPointerIntPtr.Zero,也可能是因爲數據少於預期。另外,你確定C++庫正在處理內存的處理嗎?

相關問題