天天看點

MFC中消息循環處理的幾個函數之間的差別

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