1. 程式人生 > >MFC中訊息迴圈處理的幾個函式之間的區別

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: 取回控制權,使程式執行一段時間,等待可能的訊息進入訊息佇列並將其捕獲;這時程式進入空閒時間階段;