传递信息并从另一个线程通知线程的最简单方法

时间:2013-10-29 09:17:55

标签: c# c++ multithreading

我有一个C#应用程序,它在加载时在新线程上调用来自非托管C ++ DLL的函数(在Windows上)。此时,它们作为并行线程运行并执行不同的任务。 DLL函数每隔一段时间将一些信息写入内存映射文件。我希望此函数在完成写入MMF后向C#应用程序发送通知。这个通知带有一些数字会更好,但如果这使事情复杂化则不是必须的。

修改

整个过程中发生的事情是C ++库正在执行一些繁重的计算任务,而C#app是一个用作GUI的WPF项目,C ++将其状态更新发送为一个很长的向量参数,打印到MMF(似乎是一种快速有组织的方式)。这些信息应该在GUI中显示。

在评论中,有人说使用MMF这不是一个好习惯,因为所有的活动都是在同一个过程中进行的。我愿意接受如何更好地规划此程序的建议。

1 个答案:

答案 0 :(得分:2)

您可以将委托作为回调函数传递给非托管函数,以便在完成后通知调用者(C#app)。

使用像这样的C ++函数

void SetFinishedCallback(void (*callback)(bool success));

然后使用

导入C#中的函数
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void FinishedDelegate([MarshalAs(UnmanagedType.U1)]bool success);

[DllImport("unmanaged.dll")]
private static extern void SetFinishedCallback(FinishedDelegate callback);

您应该能够使用

调用该函数
SetFinishedCallback(MyFuncAcceptingBool);

编辑:您原则上也可以传递整个计算结果,而不是传递bool来指示成功/失败,而不再需要MMF。这引发了编组问题,因为您必须将数据从非托管代码传递到托管代码。如果你有一个简单的数据结构(比如一个字节数组),那将很容易。

在C ++中使用

void SetFinishedCallback(void (*callback)(void* data, int length));

在C#中使用

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void FinishedDelegate(IntPtr data, int length);

您必须在回调方法中手动转换IntPtr。