在不同的线程中运行回调

时间:2015-03-03 07:04:11

标签: c#

我有一个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);
    }

1 个答案:

答案 0 :(得分: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 ++库正在处理内存吗?