如何判断一个线程是否有消息队列?

时间:2009-11-24 10:57:57

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

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

基本上有一些windows api只有在线程有消息queue.window

时才有效

4 个答案:

答案 0 :(得分:7)

您可以将PostThreadMessage与线程的ID一起使用。如果PostThreadMessage返回false并且GetLastError返回ERROR_INVALID_THREAD_ID,则线程ID无效或者线程没有消息队列。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

我认为IsGUIThread是必需的功能

答案 3 :(得分:0)

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