一般情況下,呼叫afxbeginthread()來一次性地建立並啟動乙個執行緒,但是也可以通過兩步法來建立執行緒:首先建立cwinthread類的乙個
物件,然後呼叫該物件的成員函式createthread()來啟動該執行緒。
virtual bool cwinthread::initinstance();
過載該函式以控制使用者介面執行緒例項的初始化。初始化成功則返回非0值,否則返回0。使用者介面執行緒經常過載該函式,工作者執行緒一般不
使用initinstance()。
virtual int cwinthread::exitinstance();
initinstance()成員函式一樣,該函式也只適用於使用者介面執行緒。
mfc多執行緒程式設計例項
在visual c++
6.0程式設計環境中,我們既可以編寫c風格的32位win32應用程式,也可以利用mfc類庫編寫c++風格的應用程式,二者各有其優缺點。基於win32的
應用程式執行**小巧,執行效率高,但要求程式設計師編寫的**較多,且需要管理系統提供給程式的所有資源;而基於mfc類庫的應用程式可以
快速建立起應用程式,類庫為程式設計師提供了大量的封裝類,而且developer
studio為程式設計師提供了一些工具來管理使用者源程式,其缺點是類庫**很龐大。由於使用類庫所帶來的快速、簡捷和功能強大等優越性,因此
除非有特殊的需要,否則visual
c++推薦使用mfc類庫進行程式開發。
我們知道,mfc中的執行緒分為兩種:使用者介面執行緒和工作者執行緒。我們將分別舉例說明。
用 mfc 類庫程式設計實現工作者執行緒
例程5 multithread5
為了與win32 api對照,我們使用mfc 類庫程式設計實現例程3 multithread3。
建立乙個基於對話方塊的工程multithread5,在對話方塊idd_multithread5_dialog中加入乙個編輯框idc_millisecond,乙個按鈕idc_start,標題
為「開始」
,乙個進度條idc_progress1;
開啟classwizard,為編輯框idc_millisecond新增int型變數m_nmillisecond,為進度條idc_progress1新增cprogressctrl型變數
m_ctrlprogress;
在multithread5dlg.h檔案中新增乙個結構的定義: struct threadinfo
;
執行緒函式的宣告:uint threadfunc(lpvoid lpparam);
注意,二者應在類cmultithread5dlg的外部。
在類cmultithread5dlg內部新增protected型變數:
cwinthread* pthread;
在multithread5dlg.cpp檔案中進行如下操作:定義公共變數:threadinfo info;
雙擊按鈕idc_start,新增相應訊息處理函式:
void cmultithread5dlg::onstart()
在函式bool cmultithread3dlg::oninitdialog()中新增語句:
新增執行緒處理函式: uint threadfunc(lpvoid lpparam)
return 0;
}
用 mfc 類庫程式設計實現使用者介面執行緒
建立使用者介面執行緒的步驟:
使用classwizard建立類cwinthread的派生類(以cuithread類為例) class cuithread : public
cwinthread
}afx_virtual
// implementation
protected:
virtual ~cuithread();
// generated message map functions
//}afx_msg
declare_message_map()
};
過載函式initinstance()和exitinstance()。 bool cuithread::initinstance()
建立新的使用者介面執行緒 void cuithreaddlg::onbutton1()
請注意以下兩點:
a、在uithreaddlg.cpp的開頭加入語句: #include "uithread.h"
b、把uithread.h中類cuithread()的建構函式的特性由 protected 改為 public。
使用者介面執行緒的執行次序與應用程式主線程相同,首先呼叫使用者介面執行緒類的initinstance()函式,如果返回true,繼續呼叫執行緒的run()
函式,該函式的作用是執行乙個標準的訊息迴圈,並且當收到wm_quit訊息後中斷,在訊息迴圈過程中,run()函式檢測到執行緒空閒時(沒有消
息),也將呼叫onidle()函式,最後run()函式返回,mfc呼叫exitinstance()函式清理資源。
你可以建立乙個沒有介面而有訊息迴圈的執行緒,例如:你可以從cwinthread派生乙個新類,在initinstance函式中完成某項任務並返回
false,這表示僅執行initinstance函式中的任務而不執行訊息迴圈,你可以通過這種方法,完成乙個工作者執行緒的功能。
例程6 multithread6
建立乙個基於對話方塊的工程multithread6,在對話方塊idd_multithread6_dialog中加入乙個按鈕idc_ui_thread,標題為「使用者介面執行緒」
右擊工程並選中「new class…」為工程新增基類為cwinthread派生執行緒類cuithread。
給工程新增新對話方塊idd_uithreaddlg,標題為「執行緒對話方塊」。
為對話方塊idd_uithreaddlg建立乙個基於cdialog的類cuithreaddlg。使用classwizard為cuithreaddlg類新增wm_lbuttondown訊息的處理函式
onlbuttondown,如下:
void cuithreaddlg::onlbuttondown(uint nflags, cpoint point)
在uithread.h中新增 #include "uithreaddlg.h"
並在cuithread類中新增protected變數cuithread m_dlg: class cuithread : public cwinthread
}afx_virtual
// implementation
protected:
cuithreaddlg m_dlg;
virtual ~cuithread();
// generated message map functions
//}afx_msg
declare_message_map()
};
分別過載initinstance()函式和exitinstance()函式: bool cuithread::initinstance()
int cuithread::exitinstance()
雙擊按鈕idc_ui_thread,新增訊息響應函式: void cmultithread6dlg::onuithread()
並在multithread6dlg.cpp的開頭新增: #include "uithread.h"
好了,編譯並執行程式吧。每單擊一次「使用者介面執行緒」按鈕,都會彈出乙個執行緒對話方塊,在任何乙個執行緒對話方塊內按下滑鼠左鍵,都會
彈出乙個訊息框。
Windows 執行緒漫談 介面執行緒和工作者執行緒
每個系統都有執行緒,而執行緒的最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應力。執行緒分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個 訊息佇列 訊息佇列 也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!...
Windows執行緒漫談介面執行緒和工作者執行緒
每個系統都有執行緒,而執行緒的最重要的作用就是並行處理,提高軟體的併發率。針對介面來說,還能提高介面的響應力。執行緒分為介面執行緒和工作者執行緒,介面實際就是乙個執行緒畫出來的東西,這個執行緒維護乙個 訊息佇列 訊息佇列 也是介面執行緒和工作者執行緒的最大區別,這個詞應該進到你的腦子裡,根深蒂固的!...
MFC工作者執行緒
工作者執行緒 1.在標頭檔案中新增uint threadfunc lpvoid lpparam 注意應在類的外部 2.新增protected型變數 cwinthread pthread 3.新增執行緒處理函式 uint threadfunc lpvoid lpparam return 0 4.開啟執...