C# 传递信息并从另一个线程通知线程的最简单方法 我有一个C应用程序,它在一个新线程上加载一个非托管C++ DLL函数,当它加载到Windows上时。此时,它们作为并行线程运行并执行不同的任务。DLL函数每隔一段时间将一些信息写入内存映射文件。我希望此函数在完成对MMF的写入后向C应用程序发送通知。这个通知最好有一些数字,但如果这使事情复杂化,它不是必须的

C# 传递信息并从另一个线程通知线程的最简单方法 我有一个C应用程序,它在一个新线程上加载一个非托管C++ DLL函数,当它加载到Windows上时。此时,它们作为并行线程运行并执行不同的任务。DLL函数每隔一段时间将一些信息写入内存映射文件。我希望此函数在完成对MMF的写入后向C应用程序发送通知。这个通知最好有一些数字,但如果这使事情复杂化,它不是必须的,c#,c++,multithreading,C#,C++,Multithreading,编辑: 整个过程中发生的是C++库执行一些繁重的计算任务,而C应用程序是一个用作GUI的WPF项目,C++将其状态的更新作为一个很长的参数向量发送给MMF,看起来像是一种快速而有组织的方式。此信息应显示在GUI中 在评论中,有人说使用MMF在这里不是一个好的做法,因为所有活动都是在同一个过程中执行的。我愿意听取如何更好地计划此过程的建议。您可以将委托作为回调函数传递给非托管函数,以便它在完成时通知调用方C应用程序 使用C++这样的函数< /P> void SetFinishedCallback(

编辑:

整个过程中发生的是C++库执行一些繁重的计算任务,而C应用程序是一个用作GUI的WPF项目,C++将其状态的更新作为一个很长的参数向量发送给MMF,看起来像是一种快速而有组织的方式。此信息应显示在GUI中


在评论中,有人说使用MMF在这里不是一个好的做法,因为所有活动都是在同一个过程中执行的。我愿意听取如何更好地计划此过程的建议。

您可以将委托作为回调函数传递给非托管函数,以便它在完成时通知调用方C应用程序

使用C++这样的函数< /P>

void SetFinishedCallback(void (*callback)(bool success));
然后使用

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void FinishedDelegate([MarshalAs(UnmanagedType.U1)]bool success);

[DllImport("unmanaged.dll")]
private static extern void SetFinishedCallback(FinishedDelegate callback);
您应该能够使用

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

C++中使用< < /P>
void SetFinishedCallback(void (*callback)(void* data, int length));
在C中使用

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

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

如果你想得到好的建议,我想你需要多解释。首先,是什么让你选择了内存映射文件?对我来说,听起来好像你想把一些信息从一个线程传递到另一个线程,两者都在同一个进程中运行。@helb我想你是对的,editedMemory映射文件在这里完全错了。这是一个正在处理的问题。@DavidHeffernan我已经编辑了问题的名称和内容,我很高兴听到你确切地说些什么。如果应用程序正在调用另一个dll上的方法,则这两个线程在同一进程内运行。不需要进程间通信。@RonTeller这对于代码来说太早了。首先,您需要决定使用什么体系结构。如果你没有正确的体系结构,你就不能编写代码。这解决了C++的C问题,而不是交叉线程问题。@皮特真的,但是正如David Heffernan所说,代码太早了。线程安全解决方案将在回调函数中实现,并取决于应用程序设计。