2011-09-20 70 views
5

我想在一個線程上創建一個窗口,然後讓HWND遷移到任意數量的線程中執行它。我的程序將有多個這樣的窗口。這是可能的還是Win32 API不是爲此設計的?Win32窗口線程安全嗎?

+0

所以你想在一個線程上創建一些東西,然後在另一個線程上刪除它,並且你沒有看到這個想法的問題? – AJG85

+1

@AJG:'new' /'delete'沒有問題。完全有理由懷疑其他資源。 – MSalters

+0

@ MSalters:取決於實現,但沒有提及堆分配。只是爲了防止被忽視而提起它。 – AJG85

回答

6

不,這是不可能的。窗口用於其消息循環的線程(您稱之爲「正在執行」)是在創建窗口時定義的。您可以創建多個線程並從它們開始消息循環(從而在其上創建窗口),但這通常被認爲是危險的。

+4

Downvoter關心評論? –

+0

有人在這個頁面上沿着向下的箭頭向下,我試圖撤消它 –

+1

不是這裏的downvoter,但我想知道:爲什麼要使用多個GUI線程'危險'?這可能是一種先進的做法 - 不是您在平均Hello World或簡單對話應用程序中需要做的事情,但不是我知道的危險。這在許多複雜的應用程序中是常見的做法(Explorer,IE,也可能是辦公室)。 – BrendanMcK

2

不,這些調用沒有併發檢查。

9

是的,在一定程度上。

您可以從任何線程發送消息併發布到HWND。

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

試圖從另一個線程配置UI(例如添加對照)將結束嚴重。但是,如果您向窗口發送消息,則可以確保該消息將在創建線程上處理。

+0

這是最正確的答案 - Win32實際上是在跨線程訪問方面最爲寬鬆的UI框架,win32k.sys試圖使一切正常。然而,假裝你不知道這一點,並且像對象被線程關聯一樣操作是個更好的主意 –

+0

是的。 「大多數作品」不是我喜歡與我寫的任何東西相關的描述:)。 看來,如果你對發送/發帖消息​​(或他們的21世紀同行)不太嚴格,有時候會發生奇怪的事情。 –

+0

這是更好的答案,因爲發送消息是我感興趣的。 –

2

有兩個重要調用must be called from the same threadCreateWindowGetMessage(或它們各自的等價物)。你的解決方案不會,所以這是錯的。

您可以在任何線程中調用PostMessageSendMessage有點危險,因爲它阻塞了跨線程場景,並可能發生死鎖。

+0

我今天有一種情況,工作線程上的一些代碼從關鍵部分調用SendMessage,並且死鎖。浪費了一個小時的時間,我認爲將處理過程放到UI線程和PostMessage指令之間更爲謹慎。 – locka