主線程與使用者介面執行緒 含有訊息幫浦的執行緒 的通訊

2021-06-03 08:44:53 字數 1565 閱讀 8703

vckbase站點上,由乙個多執行緒的demo,講得是ui執行緒,如何開啟乙個ui介面執行緒.但是裡面沒有涉及到主線程如何和ui執行緒間通訊.

這個問題,我搞了好久.

其實很簡單,給乙個執行緒發訊息 postthreadmessage().

bool   postthreadmessage(  

dword   idthread, //   thread   identifier       

uint   msg, //   message   to   post  

wparam   wparam, //   first   message   parameter  

lparam   lparam   //   second   message   parameter  

);  

eg:int ret = postthreadmessage( pthread->m_nthreadid, wm_splash_notify,0, 0   );

if (ret == 0)    // :檢查返回值,是否失敗.

}wm_splash_notify是自己定義的乙個常量, 可以不用加入訊息對映 呵呵. 直接在ui執行緒的pretranslatemessage裡面捕獲處理就好了.:), 當然, 通過mfc的巨集加入訊息處理函式也可以, 不過原理是一樣的.

, 那麼主線程如何知道ui介面執行緒的id呢?

答案是: 通過afxbeginthread()函式建立執行緒時, 返回cwinthread* pthead指標.

afxbeginthread()返回乙個cwinthread*物件指標,  

cwinthread*   pthread   =   afxbeginthread(...)   ;  

pthread->m_nthreadid就是建立執行緒的id.

具體參見如下帖子.

那麼我們發了訊息後, 使用者介面執行緒如何處理訊息呢?

過載pretranslatemessage()函式.

bool cuithread::pretranslatemessage(msg* pmsg)

return cwinthread::pretranslatemessage(pmsg);

}補充說明兩點

1: 執行緒id 不同於執行緒控制代碼, id可用於給執行緒發訊息.

2: 執行緒控制代碼 可用於控制線程的執行,比如, 關閉執行緒, 暫停執行緒啥的.

也就是通常意義上的ui介面執行緒, 可以給該執行緒發訊息. 呼呼.

3,4的說法可能有問題,已經測試過,對於工作執行緒, 已經測試過, 不可以在工作執行緒裡面peekmessage.(peekmessage總是返回false, peek不到message ), .但是可以work thread成功傳送訊息, 但work thread裡面 peekmessage老是失敗.不知道cwinthread做了什麼手腳.呼呼.

msg msg;

peekmessage(&msg, null, wm_user, wm_user, pm_noremove);

參見msdn. postthreadmessage的解釋.

下面文章是codeproject上詳細講解使用者介面執行緒原理的文章.

建立使用者介面執行緒

建立使用者介面執行緒 本人節選自 21天學通c 一書 說明 中使用了declare dyncreate巨集,使用該巨集表明mythread類具有動態建立的能力。使用declare message map巨集表明具有訊息對映,可以處理命令訊息。再開啟mythread類的實現檔案 mythread.cp...

使用者介面執行緒AfxBeginThread的使用

使用者介面執行緒在執行時會有乙個視窗介面和與其相對應的視窗函式,所以它可以通過響應訊息來和使用者進行互動。afxbeginthread 函式原型如下 cwinthread afxbeginthread cruntimeclass pthreadclass,從cwinthread派生的runtime ...

使用者介面執行緒AfxBeginThread的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!使用者介面執行緒在執行時會有乙個視窗介面和與其相對應的視窗函式,所以它可以通過響應訊息來和使用者進行互動。afxbeginthread函式原型如下 cwinthread afxbeginthread cruntimeclass pthreadcla...