2011-06-24 47 views
0

STA線程同步的最佳做法是什麼?MsgWaitForMultipleObjectsEx死鎖MFC應用程序中的主STA線程

我有一個基於對話框的MFC應用程序與兩個STA線程:主要和第二個。我在主UI線程中創建了COM對象。

我從第二個線程調用COM接口。在主線程中,爲了確保第二個線程在主線程繼續之前完成,我使用一個循環來等待線程。此循環循環調用MsgWaitForMultipleObjectsEx(timout = 500)。

我立即陷入了等待的僵局。然後我意識到MFC消息泵AfxInternalPumpMessage()只能幫助阻止調用,但對死鎖情況根本沒有幫助。

然後我將Peek/Translate/DispatchMessage代碼添加到等待循環中,然後全部工作。

現在,似乎沒有手動編碼Peek/Translate/DispatchMessage循環,你不能做STA線程同步嗎?任何等待電話都會使您陷入僵局。那麼什麼是同步STA線程的最佳或標準方式?

謝謝!

+0

爲什麼你需要調用MsgWaitForMultipleObjectsEx?在第二個線程中,爲什麼不在第一個線程完成時發佈消息? – wj32

回答

0

沒有任何等待,但任何停止運行消息循環的等待都會使您死鎖。解決方案是交錯等待循環和消息循環處理 - 稍等一會,然後處理所有未決消息,重複。

+0

不是MsgWaitForMultipleObjectsEx可將消息添加到隊列時配置爲返回的等待。也不是GetMessage的等待功能? –

+0

@David Heffernan:不,如果你仔細閱讀MSDN對該函數的描述,你會發現它沒有被消息中斷。 – sharptooth

+1

我猜我讀錯了,但是QS_喚醒面具做了什麼? –

1

也許您在尋找CoWaitForMultipleHandles

如果呼叫者駐留在單線程 公寓,CoWaitForMultipleHandles進入COM模式循環,和該線程的 消息循環將繼續使用調度線程的消息 濾波器 消息。如果線程沒有註冊消息過濾器 ,則使用默認的COM 消息處理。