MFC中消息循環處理的幾個函數之間的區別
更新時間: 2007-05-11 09:28:20來源: 粵嵌教育瀏覽量:813
Windows編程中一個比較原始的問題就是消息循環,現在很少有人關心這些了;
我個人對消息循環比較感興趣,對底層的很多細節想深入了解!
以下說明幾個消息循環中的常用函數進行對比
1 PostMessage 與 SendMessage 函數對比
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: 取回控制權,使程序執行一段時間,等待可能的消息進入消息隊列并將其捕獲;這時程序進入空閑時間階段;