PostMessage與SendMessage的區別

   在做基於窗口的Windows程序的時候,我們避免不了要向窗口發送消息,有兩種方式,一種是PostMessage,另外一種是SendMessage。關於這兩個宏,我是通過狠狠的看MSDN才搞明白的,那裏講的是最權威的。它們的區別如下:

1PostMessage會將消息壓入窗口所在線程的消息隊列,然後返回;而SendMessage則不經過消息隊列,SendMessage可認爲是直接調用了該窗口的窗口過程,因此在我們需要獲得消息處理後的返回值的時候,就要用到SendMessage

    例如:當在程序中指定如下使用:PostMessagehWnd, WM_MSG,0,0),那麼當程序執行到PostMessage的時候,僅將消息WM_MSG壓入到創建hWnd所指窗口的那個線程的消息隊列,然後程序將繼續執行下去,而至於程序什麼時候響應該消息,則要看那個線程什麼時候得到控制權;

    而指定如下使用:SendMessagehWnd, WM_MSG,0,0),那麼當程序執行到該處時,將發生一次跳轉:從當前位置,跳轉到hWnd的窗口過程中去響應WM_MSG消息,當消息處理結束,窗口過程返回,程序又將從SendMessage後面繼續執行,當然,我們可以獲得窗口過程對該消息的處理結果,也即取SendMessage的返回值。(這裏只是針對單線程)。

 
2、在多線程應用中,PostMessage的用法還是一樣,但SendMessage則不同了。如果在線程A中向線程B所創建的一個窗口hWndB發送消息SendMessagehWndBWM_MSG00),那麼系統將會立即將執行權從線程A切換到線程B,然後在線程B中調用hWndB的窗口過程來處理消息,並且在處理完該消息後,執行權仍然在B手中!這個時候,線程A則暫停在SendMessage處,等待下次線程A獲得執行權後才繼續執行,並且仍然可以獲得消息處理的結果(返回值)。一般,爲了避免死鎖,在B中對WM_MSG做出處理之前,要加上:
      if(InSendMessage())

       RelpyMessage(lResult)

即判斷:如果該消息是發自另外一個線程,則立即 RelpyMessage,回覆消息,參數lResult即是返回值。而如果是在同一個線程內,則InSendMessage()將會返回FALSE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章