peekmessage getmessage2009-06-24 23:26 366人閱讀 評論(0) 收藏 舉報
Peekmessage和Getmessage
http://blog.csdn.net/rbagglo/archive/2009/05/20/4202622.aspx
Peekmessage和Getmessage都是向系統的訊息佇列中取得訊息,不過性質不同。 若第一次向訊息佇列中取不到訊息,則程式的主線程會被OS(作業系統)掛起;等到OS重新調度到該線程時,而且訊息佇列仍然是空的時,兩者的性質不同:
若使用Getmessage(),則程式的主線程會仍被OS掛起。
若是用Peekmessage(),則程式會取得OS控制權,運行一段時間。此函數多用於處理系統的空閑時間。
getmessage and peekmessage are both get the message from send_message queue.
getmessage supports 同步機制。PEEKMESSAGE SUPPORTS 非同步機制。
從原因上而言:
GetMessage函數從訊息佇列中得到訊息後並在隊列中刪除該訊息
PeekMessage函數從訊息佇列中得到訊息後並不在隊列中刪除該訊息
從結果上而言:
GetMessage等待一個訊息(就像_getch),直到拿到訊息才返回
PeekMessage不是這樣(就像_kbhit),查詢訊息佇列,有就取,即使沒有也立即返回。
為了實現windows的多任務,要用getmessage,因為當getmessage發現自己的訊息佇列裡沒有訊息時,就會把控制權交還給系統,這樣就可以讓避免資源的浪費。
GetMessage函數每次調用是肯定會取回一個訊息的,當訊息佇列為空白的時候此進程會被掛起直到訊息佇列中有訊息可取為止。
PeekMessage函數不管訊息佇列中是否有訊息都會立即返回,返回是可以從返回的值裡判斷是否取到了訊息,準確地說此函數是詢問了一下訊息佇列,至於取回訊息後是否從訊息佇列中刪除此訊息,由參數可以指定。
Windows3.1時很多應用程式的訊息佇列是由GetMessage函數構成的,而Win32以後大多數的應用程式的訊息佇列是由 PeekMessage函數構成的,vc和bcb好像都是這樣的,基於Win32的搶先式多任務處理機制,採用PeekMessage函數構成的訊息迴圈也不會對系統造成什麼威脅。
區別一:
peekmessage不管訊息佇列裡有沒有訊息都會馬上返回,有訊息返回訊息,沒訊息返回空值,
getmessage等待到有訊息的時候才返回,
區別二:
peekmessage可以根據參數決定是否將訊息保留在隊列中,
PM_NOREMOVE:該參數指示保留訊息
PM_REMOVE:該參數指示移去訊息
而getmessage獲得訊息後回把訊息從訊息佇列中刪去
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
參數wRemoveMsg的作用是指定訊息擷取的方式,如果設為PM_NOREMOVE,那麼訊息將不會從訊息佇列中被移出,如果設為PM_REMOVE,那麼訊息將會從訊息佇列中被移出;
兩個函數主要有以下兩個區別:
1.GetMessage將等到有合適的訊息時才返回,而PeekMessage只是撇一下訊息佇列。
2.GetMessage會將訊息從隊列中刪除,而PeekMessage可以設定最後一個參數wRemoveMsg來決定是否將訊息保留在隊列中。
在Windows的內部,GetMessage和PeekMessage執行著相同的代碼。而兩者最大的不同之處則體現在沒有任何訊息返回到應用程式的情況下。在此種情況下,PeekMessage會返回一個空值到應用程式,GetMessage會在此時讓應用程式休眠。
Peekmessage和Getmessage
http://blog.csdn.net/rbagglo/archive/2009/05/20/4202622.aspx
Peekmessage和Getmessage都是向系統的訊息佇列中取得訊息,不過性質不同。 若第一次向訊息佇列中取不到訊息,則程式的主線程會被OS(作業系統)掛起;等到OS重新調度到該線程時,而且訊息佇列仍然是空的時,兩者的性質不同:
若使用Getmessage(),則程式的主線程會仍被OS掛起。
若是用Peekmessage(),則程式會取得OS控制權,運行一段時間。此函數多用於處理系統的空閑時間。
getmessage and peekmessage are both get the message from send_message queue.
getmessage supports 同步機制。PEEKMESSAGE SUPPORTS 非同步機制。
從原因上而言:
GetMessage函數從訊息佇列中得到訊息後並在隊列中刪除該訊息
PeekMessage函數從訊息佇列中得到訊息後並不在隊列中刪除該訊息
從結果上而言:
GetMessage等待一個訊息(就像_getch),直到拿到訊息才返回
PeekMessage不是這樣(就像_kbhit),查詢訊息佇列,有就取,即使沒有也立即返回。
為了實現windows的多任務,要用getmessage,因為當getmessage發現自己的訊息佇列裡沒有訊息時,就會把控制權交還給系統,這樣就可以讓避免資源的浪費。
GetMessage函數每次調用是肯定會取回一個訊息的,當訊息佇列為空白的時候此進程會被掛起直到訊息佇列中有訊息可取為止。
PeekMessage函數不管訊息佇列中是否有訊息都會立即返回,返回是可以從返回的值裡判斷是否取到了訊息,準確地說此函數是詢問了一下訊息佇列,至於取回訊息後是否從訊息佇列中刪除此訊息,由參數可以指定。
Windows3.1時很多應用程式的訊息佇列是由GetMessage函數構成的,而Win32以後大多數的應用程式的訊息佇列是由 PeekMessage函數構成的,vc和bcb好像都是這樣的,基於Win32的搶先式多任務處理機制,採用PeekMessage函數構成的訊息迴圈也不會對系統造成什麼威脅。
區別一:
peekmessage不管訊息佇列裡有沒有訊息都會馬上返回,有訊息返回訊息,沒訊息返回空值,
getmessage等待到有訊息的時候才返回,
區別二:
peekmessage可以根據參數決定是否將訊息保留在隊列中,
PM_NOREMOVE:該參數指示保留訊息
PM_REMOVE:該參數指示移去訊息
而getmessage獲得訊息後回把訊息從訊息佇列中刪去
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
參數wRemoveMsg的作用是指定訊息擷取的方式,如果設為PM_NOREMOVE,那麼訊息將不會從訊息佇列中被移出,如果設為PM_REMOVE,那麼訊息將會從訊息佇列中被移出;
兩個函數主要有以下兩個區別:
1.GetMessage將等到有合適的訊息時才返回,而PeekMessage只是撇一下訊息佇列。
2.GetMessage會將訊息從隊列中刪除,而PeekMessage可以設定最後一個參數wRemoveMsg來決定是否將訊息保留在隊列中。
在Windows的內部,GetMessage和PeekMessage執行著相同的代碼。而兩者最大的不同之處則體現在沒有任何訊息返回到應用程式的情況下。在此種情況下,PeekMessage會返回一個空值到應用程式,GetMessage會在此時讓應用程式休眠。