用vs2013+mfc程式設計,在做資料載入處理過程中經常需要多執行緒,否則程式容易卡死。首先windows多執行緒可以分為ui多執行緒和處理多執行緒:ui多執行緒繼承來自cwinthread類,主要作用是建立ui介面;這裡主要講後台資料處理多執行緒的使用,即使用win32 提供的一系列的api函式來完成執行緒的建立、掛起、恢復、終結以及通訊等工作。
1 建立多執行緒:
首先建立mfc對話方塊工程,在對話方塊類dlg類中宣告兩個引數,分別是
handlehthread;// 執行緒的控制代碼
dwordthreadid;// 執行緒的id,竟然不用初始化,應該是自動分配的吧
然後在類外宣告全域性函式,函式型別一般為uint ,即
uint threadproc(lpvoid pparam);//引數pparam為結構體指標,指向你要傳到執行緒中
//的引數,由於此函式是全域性函式,所以指標最好是全域性的
這個函式在不需要傳遞指著時,可以忽略pparam,需要傳遞時參考下面第2部分的執行緒引數傳遞。
最後在你需要的地方,也就是dlg.cpp中的函式來建立執行緒:
hthread = createthread(null,
0,(lpthread_start_routine)thread_progress,//需要執任務,不需要括號
null,//這裡在需要傳引數的時候是乙個指標
0,&threadid);//執行緒的id
2執行緒傳遞引數;
大多時候的執行緒是需要你傳遞一些引數進去的,否則執行緒函式本身是乙個全域性函式,你mfc中的一些控制項和引數不能直接使用,這些引數就以結構體的指標的形式進行傳遞。
首先在dlg.h中建立結構體:
struct messageparam
intmesg1;//用來傳遞普通型別
cprogressctrl*progress;//也可以用來傳遞控制項物件指標
然後直接在dlg.cpp中宣告全域性變數,區域性變數也應該可以。
messageparam m_param;
在建立執行緒函式之前,即hthread = createthread(。。。)之前,把引數m_param中的內容初始化,然後再建立執行緒:
hthread = createthread(null,
0,(lpthread_start_routine)threadproc,//需要執任務,不需要括號
&m_param,//這裡傳遞了乙個指標,就是需要傳遞的引數給了子執行緒
0,&threadid);//執行緒的id
最重要的是,引數傳遞給了函式threadproc(lpvoid pparam),所以這個函式就需要把傳來的引數利用起來,如下:
threadproc(lpvoid pparam)
{//首先進行強制轉換,把lpvoid型別轉換成你需要的格式,
messageparam* mp=( messageparam*) pparam;
//通過這句轉換就可以使用mp中的引數了
3執行緒掛起和恢復
這裡只是介紹兩個函式,
suspendthread(hthread);//執行緒暫停
resumethread(hthread);//執行緒恢復
4執行緒的終結,
closehandle(hthread);//
這個函式將此控制代碼的執行緒close,但執行緒不會立即消失,而是在完成執行緒任務後清理出記憶體來
注意事項:多執行緒種最麻煩的是多個執行緒同時訪問乙個檔案或對引數進行修改,由於cpu多執行緒是將時間片分給不同的執行緒執行,所以就會產生衝突或者資料已經被執行緒a修改了,但執行緒b卻不知道的情況,這就需要執行緒鎖;還有就是乙個執行緒需要修改ui執行緒中的顯示內容時,需要通過mfc訊息傳遞機制才能保證安全問題,針對這兩個問題,我會在以後遇到的時候再記錄下來,大家可以參考msnd。
多執行緒 引數傳遞
4,unique ptr作為引數傳遞,必須使用move函式 5,函式的指標作為引數傳遞 引用傳遞,指標傳遞的注意事項 因為執行緒2裡使用的是執行緒1的變數a,所以如果執行緒1比執行緒2提前結束了,結束的同時就會釋放變數a的記憶體空間,可是這時執行緒2還沒結束,再去訪問執行緒1中的變數a的話,就會發生...
C 多執行緒引數傳遞
在多執行緒或單執行緒任務中,讓執行緒帶傳入引數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳引數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.net2.0中新增加的帶引數執行執行緒的方法,示例程式如下 parameterizedthreadstart p...
C 多執行緒引數傳遞
c 多執行緒引數傳遞 在多執行緒或單執行緒任務中,讓執行緒帶傳入引數一直是個麻煩的問題,通常有種方法就是以類,對像的變數來傳引數,這種方法理解上很簡單不過在某些場合使用很麻煩,這裡就不介紹了,我們主要介紹一種.net2.0中新增加的帶引數執行執行緒的方法,示例程式如下 parameterizedth...