【问题标题】:How to find out if a thread has message queue?如何判断一个线程是否有消息队列?
【发布时间】:2010-12-19 20:19:00
【问题描述】:

有没有办法从 threadId 中找出线程是否有消息队列?

基本上有一些windows api只有在线程有消息queue.window时才起作用

【问题讨论】:

    标签: c++ windows winapi message-queue message


    【解决方案1】:

    您可以尝试从具有消息队列的线程中使用 AttachThreadInput。如果调用中引用的任一线程没有队列,我相信 AttachThreadInput 会失败。请注意,虽然 AttachThreadInput 可能由于其他原因而失败。

    【讨论】:

      【解决方案2】:

      您可以使用带有线程 ID 的 PostThreadMessage。如果 PostThreadMessage 返回 false,GetLastError 返回ERROR_INVALID_THREAD_ID,则线程 ID 无效或线程没有消息队列。

      更多信息http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx

      【讨论】:

      • @MSalters。来自 MSDN:“发布消息的线程必须已创建消息队列,否则对 PostThreadMessage 的调用将失败”。所以对我来说是了解目标线程是否有消息队列的好方法。你看到了什么比赛条件?
      【解决方案3】:

      在多线程世界中,您无法正确考虑在查看时可能发生变化的事物。线程消息队列特别有趣;它们是在线程需要它们时创建的。所以你能得到的唯一答案是“不是我上次检查的时候”。

      因此,如果没有线程消息队列,大多数 Windows API 实际上不会失败。他们只是创造它。有一个例外,PostThreadMessage。这将需要为另一个线程创建一个线程消息队列,可能在另一个线程创建自己的线程的同时。因此,它是唯一可能失败的 API。

      但是PostThreadMessage 失败是不是很糟糕?这告诉您(通过`GetLastError()),当Windows 尝试传递您的消息时,队列在重要的时刻并不存在。

      【讨论】:

        【解决方案4】:

        我认为IsGUIThread是需要的功能

        【讨论】:

        • 请求是检查任何线程,而不仅仅是调用线程。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 2013-01-14
        • 2019-08-28
        • 2020-10-30
        • 2011-06-19
        相关资源
        最近更新 更多