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

2021-09-02 16:37:08 字數 2453 閱讀 8310

每個系統中都有執行緒(至少都有乙個主線程),而執行緒最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應能力。一般的,為了應用的穩定性,在資料處理等耗時操作會單獨在乙個執行緒中執行,而所有與主ui執行緒有關的控制項資料重新整理應該到主ui執行緒中處理。也就是資料處理執行緒發訊息,讓介面ui去更新控制項。在mfc中線程分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個「訊息佇列」,「訊息佇列」也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!mfc中有兩類執行緒,分別稱之為工作者執行緒和使用者介面執行緒。二者的主要區別在於工作者執行緒沒有訊息迴圈,而使用者介面執行緒有自己的訊息佇列和訊息迴圈。

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

cwinthread* afxbeginthread(

afx_threadproc pfnthreadproc,

lpvoid pparam,

int npriority = 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,那麼新建立的執行緒就具有和主線程一樣的安全性。

常見用法:

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

cwinthread *m_pthread;

static uint threadfunction(lpvoid pparam);

uint cthreaddemodlg::threadfunction(lpvoid pparam)

return 0;

}

m_pthread = afxbeginthread((afx_threadproc)threadfunction, this);
#define wm_update_static (wm_user + 100)
cwinthread *m_pthread;

static uint threadfunction(lpvoid pparam);

afx_msg lresult onupdatestatic(wparam wparam, lparam lparam);
begin_message_map(cthreaddemodlg, cdialog)

//......

on_message(wm_update_static, &cthreaddemodlg::onupdatestatic)

//......

end_message_map()

lresult cthreaddemodlg::onupdatestatic(wparam wparam, lparam lparam)

else

return 0;

}

uint cthreaddemodlg::threadfunction(lpvoid pparam)

return 0;

}

m_pthread = afxbeginthread((afx_threadproc)threadfunction, this);

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

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

多執行緒中更新控制項顯示內容

在.net中不能直接在ui control的建立執行緒之外修改ui control的屬性和內容。乙個基本辦法是通過呼叫uicontrol 的invoke方法。考慮乙個簡單的例子 我們希望在乙個通過btnstart啟動的執行緒a中,每隔10秒把txttime的text屬性更新為 執行緒a的執行緒名 執...

在子執行緒中更新主窗體的控制項

定義乙個更新控制項的委託 定義乙個更新grid控制項的委託 public delegate void d updategrid datatable dt 定義乙個更新控制項的方法 public void bindgrid datatable dt 按鈕事件,初始化委託傳遞需要更新的內容,開始更新控制...