Multithreading 使用SendMessage的线程通信

Multithreading 使用SendMessage的线程通信,multithreading,communication,sendmessage,Multithreading,Communication,Sendmessage,我的问题是:如何使用SendMessage()实现两个线程之间的线程通信,一个有窗口(GUI),另一个没有窗口 问题是SendMessage()需要一个句柄(HWND) 关于我的项目的另一个细节:两个线程,一个运行托管代码(一个带有用户界面),另一个运行本机代码(一个没有窗口) 多谢各位 也许您应该尝试使用或如果线程没有窗口、消息队列和消息调度程序,则很难向其发送消息。线程通常只为通信目的创建隐藏窗口(看看WindowsSpy,你会看到很多例子) 一种替代方法是使用共享内存和同步原语(如事件或信

我的问题是:如何使用SendMessage()实现两个线程之间的线程通信,一个有窗口(GUI),另一个没有窗口

问题是SendMessage()需要一个句柄(HWND)

关于我的项目的另一个细节:两个线程,一个运行托管代码(一个带有用户界面),另一个运行本机代码(一个没有窗口)


多谢各位

也许您应该尝试使用或

如果线程没有窗口、消息队列和消息调度程序,则很难向其发送消息。线程通常只为通信目的创建隐藏窗口(看看WindowsSpy,你会看到很多例子)


一种替代方法是使用共享内存和同步原语(如事件或信号量)。另一种选择是使用管道。

正如@jdigital所说。请注意,如果您创建了一个隐藏窗口,并且您的线程尚未实现消息循环(无论是在常规win32 speak中,还是在COM STA的上下文中——如果您不知道我在说什么,那么您的线程中可能不存在消息循环),那么您还需要创建一个消息循环。ATL使使用
\u AtlModule.RunMessageLoop()变得相当简单不幸的是,这也意味着当线程在消息循环中时,可能需要对其进行事件驱动。你可以做一些棘手的事情,比如MsgWaitForMultipleObjects,但它会变得毛茸茸的


下面是一个示例,说明您是否熟悉ATL/COM。不久前,我经历了这种痛苦,并认为在microsoft.public.vc.atl上进行了有益的讨论,但现在我能找到的最好的讨论是。这篇文章详细介绍了消息循环的各种变体(如果您的应用程序中没有键盘加速器或无模式窗口,则应采取哪些不同的措施)。

我建议创建一个隐藏窗口。使用postthreadmessage时,您的消息可能会丢失(即:如果messagebox正在运行消息循环)

有关详情,请访问:


SendMessage是一个在多线程环境中使用的非常危险的函数,因为它不是线程安全的,并且可能导致死锁(我是根据经验说的)。我非常喜欢PostThreadMessage。是否有此函数的阻止版本?因为PostThreadMessage在不等待被调用方处理消息的情况下返回。否。实现阻塞版本并不难——使用PostThreadMessage,然后在被调用方处理消息时将设置的事件上具有调用线程阻塞