每個系統中都有執行緒(至少都有乙個主線程),而執行緒最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應能力。一般的,為了應用的穩定性,在資料處理等耗時操作會單獨在乙個執行緒中執行,而所有與主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執行緒中處理。也就是資料處理執行緒發訊息...