對話框中啟動死循環(如圖像采集識別),點擊關閉按鈕需點兩次才彈出「程序無響應」對話框,選擇「關閉程序」才能退出。
死循環佔用 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> 作為退出標誌,關閉時置位,工作線程檢測後優雅退出。WaitForSingleObject),再調用 DestroyWindow。消息泵是臨時補救,多線程分離才是 MFC/Win32 開發的正規軍規範。