使用SendMessage进行线程通信

时间:2009-01-16 19:39:37

标签: multithreading communication sendmessage

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

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

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

非常感谢!

4 个答案:

答案 0 :(得分:4)

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

有关详细信息,请访问:

http://blogs.msdn.com/oldnewthing/archive/2005/04/26/412116.aspx

答案 1 :(得分:3)

也许你应该尝试使用PostMessagePostThreadMessage

答案 2 :(得分:2)

如果线程没有窗口,没有消息队列,也没有消息调度程序,那么它就很难收到消息。线程通常只是为了通信目的而创建隐藏的窗口(看看Windows Spy,你会看到很多例子)。

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

答案 3 :(得分:2)

@jdigital说的是什么。请注意,如果您创建一个隐藏窗口,并且您的线程尚未实现消息循环(在常规win32-speak中,或者在COM STA的上下文中) - 如果您不知道我在说什么然后你的线程中可能不存在一个),你也想创建一个消息循环。 ATL使_AtlModule.RunMessageLoop();相当容易。不幸的是,这也意味着有问题的线程可能需要在消息循环中被事件驱动。你可以做一些棘手的事情,比如MsgWaitForMultipleObjects,但它变得毛茸茸。

如果您熟悉ATL / COM,这是hidden windows的示例。我在一段时间后经历了这种痛苦,并认为在microsoft.public.vc.atl上有一个有用的讨论,但我现在能找到的最好的是this post。其中详细介绍了消息循环的变体(如果您有击键加速器或无模式窗口,请采用不同的方法,听起来就像您的应用程序中没有这样)。