1. 程式人生 > >MFC 工作者執行緒例項(圖)

MFC 工作者執行緒例項(圖)

        工作者執行緒一般用於後臺複雜的計算,它沒有視窗介面,通常只是一些函式組成。下面是例項:

        關鍵知識:執行緒同步、執行緒建立。其中涉及到類 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的使用。

                 執行效果如下:(在後臺執行緒工作的同時可以操作主執行緒介面,如彈出說明等)