Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确定线程是否有消息队列?_C++_Windows_Winapi_Message Queue_Message - Fatal编程技术网

C++ 如何确定线程是否有消息队列?

C++ 如何确定线程是否有消息队列?,c++,windows,winapi,message-queue,message,C++,Windows,Winapi,Message Queue,Message,有没有办法从threadId中找出线程是否有消息队列 基本上,有些windows api只有在线程具有消息队列时才起作用。window您可以尝试从具有消息队列的线程使用AttachThreadInput。我认为,如果调用中引用的任一线程没有队列,AttachThreadInput将失败。请注意,AttachThreadInput可能由于其他原因而失败。您可以使用带有线程ID的PostThreadMessage。如果PostThreadMessage返回false,而GetLastError返回E

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


基本上,有些windows api只有在线程具有消息队列时才起作用。window

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

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


更多信息

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

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


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

我认为这是MSalters所需的功能。来自MSDN:“消息发布到的线程必须已创建消息队列,否则对PostThreadMessage的调用将失败”。因此,对于我来说,这是一个了解目标线程是否有消息队列的好方法。您看到了什么竞争条件?请求用于检查任何线程,而不仅仅是调用线程。