5

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

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

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

非常感谢!

4

4 回答 4

4

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

更多信息请访问:

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

于 2009-01-16T21:48:15.867 回答
3

也许您应该尝试使用PostMessagePostThreadMessage

于 2009-01-16T19:43:04.263 回答
2

如果线程没有窗口,没有消息队列,也没有消息分派器,那么很难给它发送消息。线程创建隐藏窗口只是为了通信目的是很常见的(看看 Windows Spy,你会看到很多例子)。

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

于 2009-01-16T20:24:12.667 回答
2

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

如果您熟悉 ATL/COM,这里有一个隐藏窗口的示例。不久前我经历了这种痛苦,并认为在 microsoft.public.vc.atl 上有一个有用的讨论,但我现在能找到的最好的是这篇文章。其中详细介绍了消息循环的变体(如果您有按键加速器或无模式窗口,您应该做些什么不同的事情,听起来您的应用程序中没有)。

于 2009-01-16T21:30:07.417 回答