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

MFC 多線程彈出模態對話框失敗分析:DoModal 重入與線程同步問題

     編輯:程式設計疑難解答

錯誤現象

工作線程中循環創建 CDialog 並調用 DoModal(),對話框閃退,線程數無限增長。

根本原因

  1. DoModal() 必須在擁有消息泵的 UI 線程調用。工作線程無消息循環,導致模態循環無法運行。
  2. Sleep(100) 間隔遠小於 DoModal() 執行時間,大量線程並發創建對話框,資源耗盡。

正確模式

// 工作線程發送消息給主線程
::PostMessage(hMainWnd, WM_USER_SHOW_DIALOG, 0, 0);

// 主線程消息處理
LRESULT CMainWnd::OnShowDialog(WPARAM, LPARAM) {
    CMyDialog dlg;
    dlg.DoModal(); // 安全
    return 0;
}

關鍵原則

所有 UI 操作(創建窗口、彈出對話框、更新控件)必須在主 UI 線程執行。工作線程通過 PostMessage/SendMessage、AfpPostTask 等機制將 UI 任務分派給主線程。

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