【问题标题】:Thread communication using SendMessage使用 SendMessage 进行线程通信
【发布时间】:2009-01-16 19:39:37
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • SendMessage 是在多线程环境中使用的一个非常危险的函数,因为它不是线程安全的并且可能导致死锁(我根据经验说话)。

标签: multithreading communication sendmessage


【解决方案1】:

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

更多信息请访问:

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

【讨论】:

    【解决方案2】:

    也许你应该尝试使用PostMessagePostThreadMessage

    【讨论】:

    • 我非常喜欢 PostThreadMessage。此功能是否有阻塞版本?因为 PostThreadMessage 没有等待被调用者处理消息就返回了。
    • 没有。实现阻塞版本不会太难 - 使用 PostThreadMessage,然后让调用线程阻塞被调用者在处理消息时将设置的事件
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-08
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多