關於SendMessage和PostMessage的理解的例子


對於SendMessage 和 PostMessage 平時口頭的解釋是

SendMessage 發送消息后等待返回,

PostMessage 發送消息后立即返回 。

 

但是這樣解釋還是不具體,什么叫等待 什么叫立即?

 

下面的代碼可以解釋,SendMessage 必須要等到消息響應函數結束,才繼續執行。

#define USER_MSG WM_USER+1

/*使用SendMessage的例子 程序執行的步驟 */
void fun()
{
// 第一步
     SendMessage(hWnd,USER_MSG);
// 第三步
     return;
    
}

void OnUserMesssage()
{
// 第二步
   do sth;
}

 

/*使用PostMessage*/
#define USER_MSG WM_USER+1
void fun()
{
//第一步
    PostMessage(hwnd,USER_MSG) ;
//第二步
    return;
}

//不知道是第幾步,等待消息隊列輪到USER_MSG消息被捕獲。
void OnUserMsg()
{
//等待窗口的后台消息處理過程通過GetMessage 取出了消息之后,再執行。
}

 

那么為什么要有這樣的區分?

 

場景1,在OnCreate 消息中,獲取子窗口的位置。

因為窗體以及其子窗口在OnCreate的時候還沒有創建完成,(收到了一個WM_CREATE消息)

此時,獲取子窗口的的位置是不可靠的。所以,可以在OnCreate 處理函數中,

向窗口以PostMessage發送一個自定義消息,等自定義消息響應時,OnCreate已經完成了。在自定義消息中獲取到子窗口的准確位置。

 

場景2,使用采集卡的例子中,當用戶發送采集信息,主程序需要得到一個圖片之后才繼續執行。那么就可以用SendMessage 來通知采集卡采圖。

如果用PostMessage,那么可能得到的是延遲一段時候后的圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM