VS2013/MFC基於對話方塊程式設計:[18]多執行緒?

很多時候單個執行緒無法滿足處理速度,當事情較多並且要求高速執行時就會出現卡頓狀態,所以很多時候多執行緒是極為必要的,這裡通過簡單例子說明多執行緒的建立和終止。

工具/原料

Visual Studio 2013

方法/步驟

開啟Demo專案,在對話方塊中新增一個按鈕,兩個靜態文字和兩個編輯框。

程式功能:主執行緒用於啟動或者停止子執行緒;子執行緒1每隔100毫秒輸出顯示一個0-1000的隨機數,子執行緒2每隔1秒顯示一次當前的系統時間。

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

修改ID,按鈕ID改為IDC_StartThread;兩個編輯框的ID分別為IDC_Random、IDC_SysTime。

雙擊按鈕自動生成事件處理函式OnBnClickedStartthread().

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

在標頭檔案中新增兩個執行緒函式的宣告,注意函式必須是靜態(static)的,形參一般為void *param。然後再定義一個標誌flag,用來表示子執行緒的關閉和啟動。初始值可以在建構函式中設定為false。

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

實現子執行緒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;

}

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

實現子執行緒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;

}

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

程式設計按鈕按下函式,用來啟動和關閉執行緒,採用AfxBeginThread函式

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

測試程式,啟動除錯,點選開啟執行緒檢視執行效果。

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

VS2013/MFC基於對話方塊程式設計:[18]多執行緒

注意事項

多個執行緒最後不要在一個函式中啟動,否則可能會出現某個執行緒不執行的情況

對話方塊, 執行緒,
相關問題答案