MFC中訊息迴圈處理的幾個函式之間的區別
Windows程式設計中一個比較原始的問題就是訊息迴圈,現在很少有人關心這些了;
我個人對訊息迴圈比較感興趣,對底層的很多細節想深入瞭解!
以下說明幾個訊息迴圈中的常用函式進行對比
1 PostMessage 與 SendMessage 函式對比
SendMessage把訊息直接傳送到視窗,並呼叫此視窗的相應訊息處理函式,等訊息處理函式結束後SendMessage才返回!SendMessage傳送的訊息不進入系統的訊息佇列;有返回值
PostMessage將訊息傳送到與建立視窗的執行緒相關聯的訊息佇列後立即返回;PostMessage函式沒有返回值;
2 GetMessage 與 PeekMessage函式的對比
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
根據引數可以看出以上2個函式的區別,引數wRemoveMsg的作用是指定訊息獲取的方式,如果設為PM_NOREMOVE,那麼訊息將不會從訊息佇列中被移出,如果設為PM_REMOVE,那麼訊息將會從訊息佇列中被移出;
還有區別:
他們如果沒有捕獲到訊息,程式的主執行緒會被作業系統掛起。當作業系統再次回來照顧此執行緒時,發現訊息佇列中仍然沒有訊息可取,此時兩個函式的行為就不同了:
GetMessage : 過門不入,作業系統再次掛起此執行緒,去照顧別的執行緒;
PeekMessage: 取回控制權,使程式執行一段時間,等待可能的訊息進入訊息佇列並將其捕獲;這時程式進入空閒時間階段;