很多時候單個執行緒無法滿足處理速度,當事情較多並且要求高速執行時就會出現卡頓狀態,所以很多時候多執行緒是極為必要的,這裡通過簡單例子說明多執行緒的建立和終止。
工具/原料
Visual Studio 2013
方法/步驟
開啟Demo專案,在對話方塊中新增一個按鈕,兩個靜態文字和兩個編輯框。
程式功能:主執行緒用於啟動或者停止子執行緒;子執行緒1每隔100毫秒輸出顯示一個0-1000的隨機數,子執行緒2每隔1秒顯示一次當前的系統時間。
修改ID,按鈕ID改為IDC_StartThread;兩個編輯框的ID分別為IDC_Random、IDC_SysTime。
雙擊按鈕自動生成事件處理函式OnBnClickedStartthread().
在標頭檔案中新增兩個執行緒函式的宣告,注意函式必須是靜態(static)的,形參一般為void *param。然後再定義一個標誌flag,用來表示子執行緒的關閉和啟動。初始值可以在建構函式中設定為false。
實現子執行緒1,注意子執行緒中無法直接訪問對話方塊的介面,需要通過重新定義指標變數與對話方塊和控制元件進行關聯,flag為真時執行執行緒,flag為假時終止執行緒。
UINT CDemoDlg::Thread1(void *param)
{
CDemoDlg *dlg = (CDemoDlg*)param;
CEdit *randBox = (CEdit*)dlg->GetDlgItem(IDC_Random);
CString str;
while (dlg->flag)
{
Sleep(100);
str.Format(_T("%i"), rand()%1000);
randBox->SetWindowTextW(str);
}
return 0;
}
實現子執行緒2,與執行緒1類似,獲取系統時間可以用CTime型別的GetCurrentTime函式
UINT CDemoDlg::Thread2(void *param)
{
CDemoDlg *dlg = (CDemoDlg*)param;
CEdit *SysTimeBox = (CEdit*)dlg->GetDlgItem(IDC_SysTime);
CString str;
while (dlg->flag)
{
Sleep(1000);
CTime time = CTime::GetCurrentTime();
str = time.Format(_T("%Y-%m-%d %H:%M:%S %A"));
SysTimeBox->SetWindowTextW(str);
}
return 0;
}
程式設計按鈕按下函式,用來啟動和關閉執行緒,採用AfxBeginThread函式
測試程式,啟動除錯,點選開啟執行緒檢視執行效果。
注意事項
多個執行緒最後不要在一個函式中啟動,否則可能會出現某個執行緒不執行的情況