MsgWaitForMultipleObjectsEx在MFC应用程序中死锁主STA线程

时间:2011-06-24 08:38:56

标签: multithreading com synchronization deadlock sta

STA线程同步最好的是什么?

我有一个基于对话框的MFC应用程序,有两个STA线程:主要和第二个。我在主UI线程中创建了COM对象。

我从第二个线程调用COM接口。在主线程中,为了确保第二个线程在主线程进行之前完成,我使用一个循环来等待线程。这个循环循环调用MsgWaitForMultipleObjectsEx(timout = 500)。

我立刻陷入了等待的僵局。然后我意识到MFC消息泵AfxInternalPumpMessage()只能帮助阻止调用,但对死锁情况根本没有帮助。

然后我将Peek / Translate / DispatchMessage代码添加到等待循环中,然后全部工作。

现在,似乎没有手动编码Peek / Translate / DispatchMessage循环,你根本不能进行STA线程同步?任何等待电话都会使你陷入僵局。那么同步STA线程的最佳或标准方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

也许您正在寻找CoWaitForMultipleHandles

  

如果调用者驻留在单线程中   公寓,CoWaitForMultipleHandles进入COM模态循环,并进入线程   消息循环将继续发送   消息使用线程的消息   过滤。如果没有注册消息过滤器   对于线程,默认COM   使用消息处理。

答案 1 :(得分:0)

没有任何等待,但任何停止运行消息循环的等待都会让你陷入僵局。解决方案是交错等待循环和消息循环处理 - 稍等一下,然后处理所有待处理的消息,重复。