2011-09-15 46 views
3

一般的問題,如果是我從一個單獨的工作線程發佈幾條消息的窗口消息泵,它們將出現在他們在我發送的順序目的地是哪裏?即..待辦事項PostMessage的()的消息顯示,爲了在Windows?

::PostMessage(m_hUsers, WM_BULKPROCESS, 0, 0); 
// ... some processing here ... 
::PostMessage(m_hUsers, WM_BULKDONE, 0, 0); 

m_hUsers是一個窗口句柄(HWND)我從我的工作線程發送消息。那麼,WM_BULKPROCESS總是會首先在窗口中顯示出來(因此會被該對話框類中的處理程序處理),還是有可能導致WM_BULKDONE在WM_BULKPROCESS之前被處理,即使它是最後發送的?

回答

2

窗口消息存儲在隊列中。所以你可以依靠FIFO機制。

+0

這就是我希望聽到的,謝謝了很多Sergius。 – AzHole

1

它們應該是,除非你在消息泵中有專門分配消息(有意或無意)的代碼,例如,以某種方式挑選兩條消息並按順序發送它們。通常,程序員按照從隊列中獲取的順序爲每條消息調用DispatchMessage。

5

有一些例外(如WM_PAINT),但通常保留消息的順序。 成像努力使鼠標輸入的意義,如果消息出現在錯誤的順序!從GetMessage函數

報價在通話過程中,該系統提供掛起,非排隊的消息, 也就是說,發送到通過使用 的SendMessage函數,SendMessageCallback,SendMessageTimeout或 SendNotifyMessage調用線程擁有窗口消息功能。然後匹配 第一個排隊的消息指定的過濾器被取回。該系統還可以處理 內部事件。如果沒有指定過濾器,消息在 下列順序處理:

Sent messages 
Posted messages 
Input (hardware) messages and system internal events 
Sent messages (again) 
WM_PAINT messages 
WM_TIMER messages 
0

我懷疑的問題是同步,而不是消息隊列。如果你的代碼允許工作線程PROC的multitple調用,你必須更嚴格地管理這個知道哪些工作線程的「實例」中發佈的消息。

您是否檢查過以確保您一次只能執行一個工作線程,或者保護m_hUsers窗口句柄以避免在BULKPROCESS和BULKDONE之間進行更改?

SendMessage可用於管理BULKDONE,因爲它將阻塞,直到消息已被處理,允許代碼調用工作線程同步工作線程的調用,並真正知道一個工作線程在調用另一線程之前已經完成。 Postmessage不會阻塞,但請記住您的工作線程的時間敏感部分是 `// ...這裏有些處理... 不發送Windows消息。