首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

多執行緒程式設計(二):MFC 多執行緒開發完整指南

     編輯:關於VC++

MFC 兩類執行緒

類型訊息迴路典型用途
工作者執行緒無後台運算、列印、資料處理等非 UI 任務
使用者介面執行緒有 (獨立訊息隊列)處理獨立 UI、輸入回應、獨立視窗

Win32 API 層面兩者無差別,MFC 透過 AfxBeginThread() 兩種多載封裝差異。

AfxBeginThread 兩種多載

// 1. 建立工作者執行緒
CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc, // 執行函數:UINT Func(LPVOID)
    LPVOID pParam,                // 傳遞參數
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,      // 0=立即執行, CREATE_SUSPENDED=建立後暫停
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

// 2. 建立 UI 執行行緒
CWinThread* AfxBeginThread(
    CRuntimeClass* pThreadClass,  // CWinThread 衍生類的 RUNTIME_CLASS
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

CWinThread 關鍵成員

  • m_hThread:執行緒核心物件句柄
  • m_nThreadID:執行緒 ID
  • m_pMainWnd:主視窗指標 (UI 執行緒)
  • virtual BOOL InitInstance():UI 執行緒初始化 (建立視窗等),成功回傳 TRUE
  • virtual int ExitInstance():UI 執行緒清理,回傳結束碼
  • BOOL CreateThread(...):兩階段建立 (先建物件再啟動)

範例一:工作者執行緒 - 進度條更新

專案 MultiThread5,對話框含編輯框 (間隔毫秒)、按鈕、進度條。

// 共用結構體
struct ThreadInfo {
    UINT nMilliSecond;
    CProgressCtrl* pProgress;
};

// 執行函數 (全域或靜態)
UINT ThreadFunc(LPVOID pParam) {
    ThreadInfo* pInfo = (ThreadInfo*)pParam;
    for (int i=0; i<100; i++) {
        pInfo->pProgress->SetPos(i);
        Sleep(pInfo->nMilliSecond);
    }
    return 0;
}

// 啟動按鈕
void CMultiThread5Dlg::OnStart() {
    UpdateData(TRUE);
    m_info.nMilliSecond = m_nMilliSecond;
    m_info.pProgress = &m_ctrlProgress;
    m_pThread = AfxBeginThread(ThreadFunc, &m_info);
}

範例二:UI 執行緒 - 獨立對話框視窗

步驟:

  1. ClassWizard 新增 CWinThread 衍生類 CUIThread
  2. 新增對話框資源 IDD_UITHREADDLG 及類別 CUIThreadDlg
  3. CUIThread 成員加入 CUIThreadDlg m_dlg
  4. 覆寫 InitInstance/ExitInstance:
BOOL CUIThread::InitInstance() {
    m_dlg.Create(IDD_UITHREADDLG);
    m_dlg.ShowWindow(SW_SHOW);
    m_pMainWnd = &m_dlg;
    return TRUE;
}
int CUIThread::ExitInstance() {
    m_dlg.DestroyWindow();
    return CWinThread::ExitInstance();
}

啟動:

void CMultiThread6Dlg::OnUiThread() {
    AfxBeginThread(RUNTIME_CLASS(CUIThread));
}

每次點擊按鈕彈出獨立對話框,擁有獨立訊息迴路,滑鼠左鍵彈出訊息框互不干擾。

UI 執行緒執行流程

  1. InitInstance() → 回傳 TRUE 才繼續
  2. Run():標準訊息迴路 (GetMessage/DispatchMessage),空閒時呼叫 OnIdle()
  3. 收到 WM_QUIT 退出迴路
  4. ExitInstance() 清理資源

特殊用法:無 UI 但有訊息迴路的執行緒

InitInstance() 執行特定任務後回傳 FALSE,不進入 Run(),可作為帶訊息處理能力的工作者執行緒。

結語

MFC AfxBeginThread 封裝了執行緒建立細節,工作者執行緒適合純計算,UI 執行緒適合獨立視窗。理解 CWinThread 生命週期與虛擬函數,能靈活構建多執行緒架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved