MFC 子執行緒中(跨執行緒)更新控制項顯示內容

2021-08-14 15:40:25 字數 3793 閱讀 6123

每個系統中都有執行緒(至少都有乙個主線程),而執行緒最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應能力。一般的,為了應用的穩定性,在資料處理等耗時操作會單獨在乙個執行緒中執行,而所有與主ui執行緒有關的控制項資料重新整理應該到主

ui執行緒中處理。也就是資料處理執行緒發訊息,讓介面

ui去更新控制項。在

mfc中線程分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個「訊息佇列」,「訊息佇列」也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!

mfc中有兩類執行緒,分別稱之為工作者執行緒和使用者介面執行緒。二者的主要區別在於工作者執行緒沒有訊息迴圈,而使用者介面執行緒有自己的訊息佇列和訊息迴圈。

在mfc中,一般用全域性函式

afxbeginthread()

來建立並初始化乙個執行緒(工作者執行緒,還有乙個過載形式是用於建立使用者介面執行緒)的執行。函式原型:

[cpp]view plain

copy

cwinthread* afxbeginthread(  

afx_threadproc pfnthreadproc,  

lpvoid

pparam,  

intnpriority = thread_priority_normal,  

uint

nstacksize = 0,  

dword

dwcreateflags = 0,  

lpsecurity_attributes lpsecurityattrs = null   

);  

返回值:

成功時返回乙個指向新執行緒的執行緒物件的

指標,否則null。

pfnthreadproc:執行緒的入口函式,宣告一定要如下: uint mythreadfunction(lpvoid pparam),不能設定為

null。如果是類成員函式,一定要是靜態成員函式。

pparam:傳遞入執行緒的引數,注意它的型別為:lpvoid,所以我們可以傳遞乙個

結構體或者類物件到執行緒

。一般傳遞this指標,以方便呼叫類的非靜態成員,因為執行緒函式是靜態函式。

npriority:執行緒的優先順序,一般設定為0,讓它和

主線程具有共同的優先順序。

nstacksize:指定新建立的執行緒的棧的大小。如果為 0,新建立的執行緒具有和主線程一樣的大小的棧。

dwcreateflags:指定建立執行緒以後,執行緒有怎麼樣的標誌。可以指定兩個值:create_suspended:執行緒建立以後,會處於

掛起狀態

,直到呼叫:resumethread。0 : 建立執行緒後就開始執行。

lpsecurityattrs:指向乙個 security_attributes 的

結構體,用它來標誌新建立執行緒的安全性。如果為 null,那麼新建立的執行緒就具有和

主線程一樣的安全性。

常見用法:

[cpp]view plain

copy

afxbeginthread(mythreadfunction, 

this

);  

mfc子執行緒中更新控制項內容有兩種方法,一種是在子執行緒中通過全域性函式更新控制項內容,一種是在子執行緒中通過傳送自定義訊息來更新控制項內容。

1.在對話方塊類cthreaddemodlg中新增成員變數——執行緒物件的

指標和執行緒函式

[cpp]view plain

copy

cwinthread *m_pthread;  

static

uint

threadfunction(

lpvoid

pparam);  

2.實現執行緒函式,使用全域性函式

::setwindowtext、

::getdlgitem

更新控制項內容

[cpp]view plain

copy

uint

cthreaddemodlg::threadfunction(

lpvoid

pparam)  

return

0;  

}  

3.在成員函式

oninitdialog

建立執行緒並啟動

[cpp]view plain

copy

m_pthread = afxbeginthread((afx_threadproc)threadfunction, 

this

);   

1.在標頭檔案中定義訊息

id[cpp]view plain

copy

#define wm_update_static (wm_user + 100)

2.在對話方塊類cthreaddemodlg中新增成員——執行緒物件的

指標和執行緒函式

[cpp]view plain

copy

cwinthread *m_pthread;  

static

uint

threadfunction(

lpvoid

pparam);  

3.宣告自定義的訊息函式

[cpp]view plain

copy

afx_msg 

lresult

onupdatestatic(

wparam

wparam, 

lparam

lparam);  

4.在cpp

檔案中新增訊息對映

[cpp]view plain

copy

begin_message_map(cthreaddemodlg, cdialog)  

//......

on_message(wm_update_static, &cthreaddemodlg::onupdatestatic)  

//......

end_message_map()  

5.實現自定義訊息響應函式

[cpp]view plain

copy

lresult

cthreaddemodlg::onupdatestatic(

wparam

wparam, 

lparam

lparam)  

else

return

0;  

}  

6.實現執行緒函式,並通過

postmessage

傳送自定義訊息

[cpp]view plain

copy

uint

cthreaddemodlg::threadfunction(

lpvoid

pparam)  

return

0;  

}  

7.在成員函式

oninitdialog

建立執行緒並啟動

[cpp]view plain

copy

m_pthread = afxbeginthread((afx_threadproc)threadfunction, 

this);

WPF跨執行緒更新UI控制項

1.預設情況下,在windows應用程式中,net framework不允許在乙個執行緒中直接操作另乙個執行緒中的控制項。winform中實現跨執行緒操作控制項的兩種方法 1 關閉執行緒安全檢查 control.checkforillegalcrossthreadcalls false 2 使用控制...

C 跨執行緒操作控制項 子執行緒修改主線程式控制件

3.子執行緒修改主線程式控制件 1 錯誤的直接使用 1 voidchangetext 2 效果圖 2 關閉跨執行緒的檢查 1 checkforillegalcrossthreadcalls false 效果圖 注 引數型別是object型 1 public delegate void changet...

MFC子執行緒中更新控制項內容的兩種辦法

每個系統中都有執行緒 至少都有乙個主線程 而執行緒最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應能力。一般的,為了應用的穩定性,在資料處理等耗時操作會單獨在乙個執行緒中執行,而所有與主ui執行緒有關的控制項資料重新整理應該到主ui執行緒中處理。也就是資料處理執行緒發訊息...