MFC 消息處理是單線程串行的。主線程消息循環 GetMessage → DispatchMessage → WindowProc → 消息映射 → Handler **一次只處理一條消息**,下一條消息必須等待上一條 Handler 返回。因此:
WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP,但它們**依次進入隊列、依次分發、依次執行**。AfxBeginThread、std::thread),則工作線程與主線程**確實並發**,此時共享數據需同步(CCriticalSection、std::mutex)。| 場景 | 本質 | 對策 |
|---|---|---|
Handler 內調用 SendMessage 觸發同步重入 | 同步發送會**立即**進入目標窗口 WindowProc,當前 Handler 暫停,子 Handler 執行完才返回 | 改用 PostMessage 異步投遞,或重入檢查 if (m_bInHandler) return; |
| 工作線程與主線程共享成員變量 | 真正的多線程並發 | 鎖保護、原子變量、不可變數據、線程局部存儲 |
定時器 WM_TIMER 高頻觸發 | 仍是串行,但若處理耗時 > 間隔,會堆積導致 UI 卡頓 | 耗時操作拋給工作線程,Handler 僅投遞任務 |
《MFC 消息處理機制與線程安全深度分析》,含重入陷阱實戰案例。