Peekmessage和Getmessage的區別

來源:互聯網
上載者:User
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會在此時讓應用程式休眠。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.