回覆列表
  • 1 # 使用者7134588015299

    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。

  • 2 # pietr49411

    具體的引數情況就不為摟住列舉了,相信樓主已經查過msdn.說說區別 PostMessage只負責將訊息放到訊息佇列中,不確定何時及是否處理 SendMessage要等到受到訊息處理的返回碼(DWord型別)後才繼續 PostMessage執行後馬上返回 SendMessage必須等到訊息被處理後才會返回。

  • 3 # 使用者2458114238191884

    其實你在網上搜索一下就可以找到很多答案!難道網上的回答都滿足不了你,那你指望我們就能讓你理解嗎?

    我把我的理解說一下,希望你懂。

    1.SendMessage你就把他理解為呼叫視窗過程函式即可。

    LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

    這個好懂吧!把他們等同即可,SendMessage就是 呼叫WindowProc,SendMessage的返回值就是WindowProc的返回值。

    2。PostMessage就比較麻煩。

    PostMessage後,系統會把訊息放在程式的訊息佇列。

    之後訊息迴圈(這個在win32程式經常看到的)

    While(GetMessage(。。。。))

    。。。。

    DispatchMessage(。。。);

    GetMessage會獲取到這個訊息。

    (對於很多初學者來說這個GetMessage確實不要理解,

    因為它跟我們平常的程式程式碼執行思想很不同。

    Getmessage有時會堵塞,程式會停在那裡。

    它什麼時候被呼叫,誰呼叫它呢?--其實這都是系統的事,

    系統發現程式的訊息佇列有訊息了,就會讓你的程式呼叫

    Getmessage,把訊息取出來,while迴圈繼續執行,到

    DispatchMessage時就可以把它等同於呼叫視窗過程函式

    WindowProc了。

    整理一下思路就是:

    PostMessage=

    訊息進入訊息佇列-》GetMessage把訊息取出來-》程式執行到DispatchMessage-》DispatchMessage就相當於呼叫視窗過程函數了

    所以2個函式最後都會去呼叫視窗過程函式,只是PostMessage呼叫前要經歷一些“曲折”的步驟。

  • 中秋節和大豐收的關聯?
  • 如何看待蘇聯名帥朱可夫的一生遭遇?