首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 中 While 循環導致界面卡死的解決方案:多線程與 Sleep 機制

     編輯:程式設計綜合問答

問題現象

在 MFC 應用中,開發者在主界面線程中編寫了一個 while(flag) 死循環,導致界面無響應,所有按鈕均無法點擊,甚至無法通過點擊「停止」按鈕修改標誌位退出循環。

根本原因

MFC 的消息泵運行在主線程(UI 線程)中。死循環佔用了 CPU 時間片,導致消息泵無法獲取 CPU 處理繪製、點擊等消息,界面因而假死。

最佳實踐

  1. 將耗時循環移至工作線程:使用 AfxBeginThread 或 std::thread 創建獨立線程執行循環邏輯,主線程保持自由處理 UI 消息。
  2. 在循環中加入 Sleep:即使在工作線程中,也應在每次迭代結束時調用 Sleep(10~50) 釋放 CPU,避免佔用率飆升至 90% 以上影響系統性能。
  3. 線程間安全通訊:使用原子變量、互斥鎖或 MFC 的 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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved