VC中SendMessage和PostMessage的區別
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。