PostMessage與SendMessage區別
1、返回值意義的區別,先看一下 MSDN 裡的宣告:
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
其中 4 個引數的意義是一樣的,返回值型別不同。PostMessage的返回值(BOOL)表示PostMessage函式執行是否正確,SendMessage的返回值(LRESULT )表示其他程式處理訊息後的返回值。
2、PostMessage 是非同步的,SendMessage 是同步的。
PostMessage 只把訊息放入佇列,不管訊息是否被處理就返回,訊息可能不被處理;而 SendMessage 等待訊息被處理完了之後才返回,如果訊息不被處理,傳送訊息的執行緒將一直被阻塞。
3、 當一個執行緒向該執行緒所建立的視窗SendMessage訊息時,由 USER32.DLL 模組呼叫目標視窗的訊息處理程式,並將結果返回,它只是呼叫指定視窗的訊息處理過程,並不將訊息入佇列。當一個執行緒向另一個執行緒所建立的視窗 SendMessage時,該訊息要追加到接收訊息執行緒的傳送訊息佇列,然後傳送訊息的執行緒進入等待狀態,接收訊息的執行緒處理完該訊息後,由系統喚醒傳送 訊息的執行緒,這時傳送執行緒繼續進行。PostMessage 傳送訊息時,訊息要先放入執行緒的訊息佇列,然後透過訊息迴圈分派到目標視窗(DispatchMessage)。一個執行緒的訊息佇列實際上分為四種不同的 訊息佇列:Post訊息佇列、Send訊息佇列、輸入訊息佇列、應答訊息佇列。PostMessage是將訊息追加到Post訊息佇列,SendMessage是追加到Send訊息佇列,兩個佇列處理的優先順序並不一樣。
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
其中 4 個引數的意義是一樣的,返回值型別不同。PostMessage的返回值(BOOL)表示PostMessage函式執行是否正確,SendMessage的返回值(LRESULT )表示其他程式處理訊息後的返回值。
2、PostMessage 是非同步的,SendMessage 是同步的。
PostMessage 只把訊息放入佇列,不管訊息是否被處理就返回,訊息可能不被處理;而 SendMessage 等待訊息被處理完了之後才返回,如果訊息不被處理,傳送訊息的執行緒將一直被阻塞。
3、 當一個執行緒向該執行緒所建立的視窗SendMessage訊息時,由 USER32.DLL 模組呼叫目標視窗的訊息處理程式,並將結果返回,它只是呼叫指定視窗的訊息處理過程,並不將訊息入佇列。當一個執行緒向另一個執行緒所建立的視窗 SendMessage時,該訊息要追加到接收訊息執行緒的傳送訊息佇列,然後傳送訊息的執行緒進入等待狀態,接收訊息的執行緒處理完該訊息後,由系統喚醒傳送 訊息的執行緒,這時傳送執行緒繼續進行。PostMessage 傳送訊息時,訊息要先放入執行緒的訊息佇列,然後透過訊息迴圈分派到目標視窗(DispatchMessage)。一個執行緒的訊息佇列實際上分為四種不同的 訊息佇列:Post訊息佇列、Send訊息佇列、輸入訊息佇列、應答訊息佇列。PostMessage是將訊息追加到Post訊息佇列,SendMessage是追加到Send訊息佇列,兩個佇列處理的優先順序並不一樣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28699126/viewspace-757235/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Handler post(Runnable runnable)和sendMessage(Message msg)的區別比較
- &與&&, |與||區別
- C# SendMessage用法C#
- postMessage 死迴圈與 window.parent
- ??與?:的區別
- postMessage真香
- HTML5 window.postMessage 與跨域HTML跨域
- <section>與<article> 區別
- showModal()與show() 區別
- localStorage與sessionStorage 區別Session
- mouseenter與mouseover區別
- GET與POST區別
- put與putIfAbsent區別
- JavaScript 與TypeScript區別JavaScriptTypeScript
- animation與transition 區別
- classList與className區別
- NIO與IO區別
- match()與exec()區別
- JavaScript與ECMAScript 區別JavaScript
- currentTarget與target區別
- 區別mouseover與mouseenter?
- offset與style區別
- onmouseover與onmouseenter區別
- 運算子與= 區別
- MySQL的@與@@區別MySql
- prop()與attr()區別
- #include與#include區別
- mybatis #與$的區別MyBatis
- Null 與 “” 的區別Null
- exp與expdp區別
- WebViewClient與WebChromeClient 區別WebViewclientChrome
- expimp與expdpimpdp區別
- in與exist , not in與not exist 的區別
- 學習postMessage
- __weak與__block區別,深層理解兩者區別BloC
- 值型別與引用型別的區別型別
- JAVA 基本型別與 引用型別區別Java型別
- 耦合與聚合的區別比單體與微服務區別更重要微服務