MFC線程之間互相發送消息:PostThreadMessage

MFC中可以使用PostThreadMessage指定線程ID單獨發送消息,線程也可以用GetMessage函數接收消息;
(1)PostThreadMessage函數:
PostThreadMessage用法:;
函數原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM IParam);

(2)GetMessage與PeekMessage函數:
接收消息函數
主要區別:GetMessage()收到消息且消息不爲WM_QUIT時返回true,收到消息且消息爲WM_QUIT時返回false,沒收到消息時會阻塞;
PeekMessage()收到消息時返回true,沒收到消息返回false。

(3)實例:
假設已有消息#define WM_MyThread1 WM_USER + 102
UINT CMFC_DlgDlg::PMThrFun1(LPVOID param)
{
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
if(msg.message == WM_MyThread1)
{
AfxMessageBox(_T(“接收消息成功!”));
}
}
return 0;
}
void CMFC_DlgDlg::OnBnClickedButton5()
{
::PostThreadMessage(thrFun1Id, WM_MyThread1, (WPARAM)WM_MyThread1, NULL);
CString str;

str.Format(_T("%d"), thrFun1Id);
AfxMessageBox(str);

}
在這裏插入圖片描述
注意:msg結構體有很多成員變量,比如message,wParam, lParam等,但是最好只拿message變量做判斷,因爲消息值是宏定義,不會消失,但是PostThreadMessage發送的wParam和lParam值,可能會消失,原因在之前PostMessage和SendMessage的區別裏講過了。

PostThreadMessage()與GetMessage()踩的坑:
在這裏插入圖片描述
上面的圖片裏,點擊按鈕發送了BtnToEdit消息,但是線程函數一直沒有打印”呵呵”消息框,但是如果在PostThreadMessage前面加個彈出對話框,線程就可以打印”呵呵”消息框了,這說明代碼邏輯是沒問題的,頭都氣炸了,想了好久才明白,原來是線程在172行被創建,但是線程函數還沒有執行到消息循環之前,173行就已經發送了消息,所以線程函數就沒有獲取到這個消息,因此一直無法打印,如果在173行前面加個Sleep(1000),那麼等線程函數完全執行,此時就能接收到消息。
總結:創建線程之後,要隔一點時間再向其發送消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章