回覆列表
-
1 # yfdet44584
-
2 # pzyyo24296
具體的引數情況就不為摟住列舉了,相信樓主已經查過msdn.說說區別 PostMessage只負責將訊息放到訊息佇列中,不確定何時及是否處理 SendMessage要等到受到訊息處理的返回碼(DWord型別)後才繼續 PostMessage執行後馬上返回 SendMessage必須等到訊息被處理後才會返回。
1、PostMessage會將訊息壓入視窗所線上程的訊息佇列,然後返回;而SendMessage則不經過訊息佇列,SendMessage可認為是直接呼叫了該視窗的視窗過程,因此在我們需要獲得訊息處理後的返回值的時候,就要用到SendMessage。例如:當在程式中指定如下使用:PostMessage(hWnd,WM_MSG,0,0),那麼當程式執行到PostMessage的時候,僅將訊息WM_MSG壓入到建立hWnd所指視窗的那個執行緒的訊息佇列,然後程式將繼續執行下去,而至於程式什麼時候響應該訊息,則要看那個執行緒什麼時候得到控制權;而指定如下使用:SendMessage(hWnd,WM_MSG,0,0),那麼當程式執行到該處時,將發生一次跳轉:從當前位置,跳轉到hWnd的視窗過程中去響應WM_MSG訊息,當訊息處理結束,視窗過程返回,程式又將從SendMessage後面繼續執行,當然,我們可以獲得視窗過程對該訊息的處理結果,也即取SendMessage的返回值。(這裡只是針對單執行緒)。2、在多執行緒應用中,PostMessage的用法還是一樣,但SendMessage則不同了。如果線上程A中向執行緒B所建立的一個視窗hWndB傳送訊息SendMessage(hWndB,WM_MSG,0,0),那麼系統將會立即將執行權從執行緒A切換到執行緒B,然後線上程B中呼叫hWndB的視窗過程來處理訊息,並且在處理完該訊息後,執行權仍然在B手中!這個時候,執行緒A則暫停在SendMessage處,等待下次執行緒A獲得執行權後才繼續執行,並且仍然可以獲得訊息處理的結果(返回值)。一般,為了避免死鎖,在B中對WM_MSG做出處理之前,要加上:if(InSendMessage()) RelpyMessage(lResult);即判斷:如果該訊息是發自另外一個執行緒,則立即RelpyMessage,回覆訊息,引數lResult即是返回值。而如果是在同一個執行緒內,則InSendMessage()將會返回FALSE。