工作者線程一般用於後台複雜的計算,它沒有視窗介面,通常只是一些函數組成。下面是執行個體:
關鍵知識:線程同步、線程建立。其中涉及到類 CEvent、函數AfxBeginThread, 函數WaitForSingleObject等
步驟:1、建立基於對話方塊的應用程式,並在上添加相應控制項,1:
圖 1
2、建立後台函數,作為工作者線程的入口地址:
比如可以為項目添加一個新的檔案, 然後定義函數:
UINT BKThreadProc(LPVOID Param) { CWorkerThreadDlg* WorkerThreadDlg=(CWorkerThreadDlg*)Param; ::WaitForSingleObject(WorkerThreadDlg->m_eStart,INFINITE); long total=0; CString result; WorkerThreadDlg->m_ctrlProgress.SetRange(0,WorkerThreadDlg->m_nMax); for (int i=0;i<=WorkerThreadDlg->m_nMax;i++) { WorkerThreadDlg->m_ctrlProgress.SetPos(i); Sleep(20); total+=i; } result.Format("%d",total); AfxMessageBox("結果為="+result); return 0; } |
3、在對話方塊類(即CWorkerThreadDlg類)中如下操作:
新增成員變數(public): CEvent m_eStart; CProgressCtrl m_ctrlProgress; |
定義函數:即按鈕“開始運算”的事件函數 void CWorkerThreadDlg::OnBnClickedButton1() { UpdateData(1); AfxBeginThread(BKThreadProc,this); m_eStart.SetEvent(); //同步通訊 } 定義函數:按鈕“使用說明”事件 void CWorkerThreadDlg::OnBnClickedButton3() { AfxMessageBox("這個程式是利用工作者線程實現的。/n輸入一個數字後程式便在後台運行,這/n裡故意作了延時處理,同時顯示進度,所/n以您可以在下面的輸入框中動作。"); } |
| |
4、以上便是主要步驟,基本上就這些,關鍵是函數AfxBeginThread、WaitForSingleObject以事件同步類CEvent的使用。
運行效果如下:(在後台線程工作的同時可以操作主線程介面,如彈出說明等)