2009-11-24 58 views

回答

7

您可以使用帶有線程ID的PostThreadMessage。如果PostThreadMessage返回false並且GetLastError返回ERROR_INVALID_THREAD_ID,則線程標識無效或線程沒有消息隊列。

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

+0

-1,有一點點的競爭條件在這裏。 – MSalters 2009-11-26 14:50:23

+1

@ MSalters。來自MSDN:「發佈消息的線程必須創建消息隊列,否則對PostThreadMessage的調用失敗」。所以對我來說,知道目標線程是否有消息隊列是一種好方法。你看到什麼競賽條件? – jrbjazz 2009-11-26 16:06:56

0

你可以嘗試使用AttachThreadInput從裏面確實有一個消息隊列線程工作。如果在調用中引用的任何線程沒有隊列,我相信AttachThreadInput會失敗。請注意,AttachThreadInput可能因其他原因失敗。

2

在一個多線程的世界裏,你不能正確地考慮的事情,而你正在尋找的是可以改變的。線程消息隊列特別有趣;它們是在線程需要它們時創建的。所以你可以得到的唯一答案是「不是當我上次檢查」。

因此,如果沒有線程消息隊列,大多數Windows API將不會真正失敗。他們只是創造它。有一個例外,PostThreadMessage。這需要爲另一個線程創建一個線程消息隊列,可能與其他線程創建它自己的線程消息隊列同時發生。因此,它是唯一可能會失敗的API。

PostThreadMessage失敗不好嗎?這告訴你(通過`GetLastError()),當Windows試圖傳遞你的消息時,這個隊列在重要時刻不存在。

2

我覺得IsGUIThread是需要的功能

+0

該請求用於檢查任何線程,而不僅僅是調用線程。 – axilmar 2011-05-12 12:13:38