在 MFC 應用中,開發者在主界面線程中編寫了一個 while(flag) 死循環,導致界面無響應,所有按鈕均無法點擊,甚至無法通過點擊「停止」按鈕修改標誌位退出循環。
MFC 的消息泵運行在主線程(UI 線程)中。死循環佔用了 CPU 時間片,導致消息泵無法獲取 CPU 處理繪製、點擊等消息,界面因而假死。
AfxBeginThread 或 std::thread 創建獨立線程執行循環邏輯,主線程保持自由處理 UI 消息。Sleep(10~50) 釋放 CPU,避免佔用率飆升至 90% 以上影響系統性能。PostMessage 機制讓主線程安全讀寫標誌位。// 工作線程函數
UINT WorkerThread(LPVOID pParam) {
CMyDialog* pDlg = (CMyDialog*)pParam;
while (pDlg->m_bRunning) {
// 執行具體任務
DoSomeWork();
// 釋放 CPU,降低佔用率
Sleep(20);
}
return 0;
}
// 啟動按鈕處理
void CMyDialog::OnStart() {
m_bRunning = TRUE;
AfxBeginThread(WorkerThread, this);
}
// 停止按鈕處理
void CMyDialog::OnStop() {
m_bRunning = FALSE;
}