我有一个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 :(得分: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异常听起来并不是一个好主意:)
具体的例外情况可以让您更好地了解您正在处理的内容。可能是imgPointer
是IntPtr.Zero
,或者可能是数据少于预期。另外,你确定C ++库正在处理内存吗?