問題引入:單執行緒阻塞
void CSingleThreadDlg::OnSleepSixSecond() {
Sleep(6000); // 6 秒內整個程式無回應 ("當機")
}
耗時操作阻塞 UI 訊息迴路,急需多執行緒解決。
核心概念
- 進程:執行中的程式實例,擁有獨立虛擬位址空間、代碼、資料、系統資源
- 執行緒:進程內執行單元,共享進程資源 (虛擬記憶體、全域變數、句柄等)
- 每進程至少一主執行緒 (由系統自動建立,入口為
main/WinMain)
- 使用者可建立額外執行緒,實現並發 (單 CPU 以時間片輪轉模擬並行)
- 執行緒切換有開銷,過多活躍執行緒反而降低效能
Win32 API 關鍵函數
| 函數 | 用途 |
CreateThread | 建立執行緒,回傳句柄 |
SuspendThread/ResumeThread | 暫停/恢復執行緒 |
ExitThread | 執行緒自行結束 |
TerminateThread | 強制終止 (不推薦,資源洩漏風險) |
PostThreadMessage | 向執行緒佇列張貼訊息 |
WaitForSingleObject | 等待執行緒/同步物件訊號 |
範例專案系列 (MultiThread1~4)
MultiThread1:基本建立與停止
- 全域
volatile BOOL g_bRun 控制執行緒迴圈
- 執行緒函數每秒更新對話框時間顯示
- 「啟動」按鈕呼叫
CreateThread,「停止」按鈕設 g_bRun=FALSE
MultiThread2:傳遞整數參數與等待結束
CreateThread 參數傳遞 (VOID*)integer
- 主執行緒呼叫
WaitForSingleObject(hThread, INFINITE) 等待結束
- 注意:等待期間主執行緒阻塞,UI 無回應
MultiThread3:傳遞結構體指標 (含進度條)
- 定義
ThreadInfo 含間隔時間與進度條指標
- 執行緒更新進度條
- 死鎖教訓:若主執行緒
WaitForSingleObject 等待執行緒,而執行緒需主執行緒處理繪圖訊息 → 雙向等待死鎖
- 解決:主執行緒不要等待,改用非阻塞方式
MultiThread4:測試系統最大執行緒數
- 迴圈不斷
CreateThread 直到失敗
- 每執行緒
Sleep(3000) 保持存活
- 最後
Sleep(5000) 等待所有結束
關鍵程式碼片段
// 建立執行緒 (同步方式)
HANDLE hThread = CreateThread(
NULL, 0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL, 0, &ThreadID);
// 等待執行緒結束 (INFINITE 無限等待)
WaitForSingleObject(hThread, INFINITE);
// 執行緒函數原型
DWORD WINAPI ThreadFunc(LPVOID lpParam) { ... }
下一篇預告
將介紹 MFC 封裝的 AfxBeginThread、CWinThread 類別,以及工作者/UI 執行緒的實作模式,簡化多執行緒開發複雜度。
- 上一篇文章: 多執行緒程式設計(二):MFC 多執行緒開發完整指南
- 下一篇文章: VC++ 實作類 QQ 遊戲大廳導航樹控件:自繪、位圖、漸層背景完整指南
Copyright ©
程式碼之家 All Rights Reserved