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

VC/MFC 程序關閉時卡死彈出「程序無響應」的消息泵解決方案

     編輯:程式設計綜合問答

問題現象

對話框中啟動死循環(如圖像采集識別),點擊關閉按鈕需點兩次才彈出「程序無響應」對話框,選擇「關閉程序」才能退出。

根本原因

死循環佔用 UI 線程,導致消息隊列無法處理 WM_CLOSE、WM_QUIT 等系統消息,Windows 判定程序「無響應」並介入。

解決方案:在循環中插入消息泵


while (startStop)
{
    // 業務邏輯...
    grab_image_start(...);
    find_bar_code(...);
    disp_obj(...);

    // 關鍵:處理窗口消息,保持響應
    MSG msg;
    if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
}

更佳架構建議

  • 工作線程分離: 將耗時循環移至 AfxBeginThread 或 std::thread,UI 線程保持空閒響應關閉。
  • 標誌位同步: 使用 volatile bool 或 std::atomic<bool> 作為退出標誌,關閉時置位,工作線程檢測後優雅退出。
  • 覆寫 OnClose: 設置標誌位,等待工作線程結束 (WaitForSingleObject),再調用 DestroyWindow。

總結

消息泵是臨時補救,多線程分離才是 MFC/Win32 開發的正規軍規範。

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