Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading MsgWaitForMultipleObjectsEx在MFC应用程序中锁定主STA线程_Multithreading_Com_Synchronization_Deadlock_Sta - Fatal编程技术网

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

Multithreading MsgWaitForMultipleObjectsEx在MFC应用程序中锁定主STA线程,multithreading,com,synchronization,deadlock,sta,Multithreading,Com,Synchronization,Deadlock,Sta,执行STA线程同步最好的方法是什么 我有一个基于对话框的MFC应用程序,它有两个STA线程:主线程和第二线程。我在主UI线程中创建了COM对象 我从第二个线程调用COM接口。在主线程中,为了确保第二个线程在主线程继续之前完成,我使用了一个循环来等待线程。此循环循环调用MsgWaitForMultipleObjectsEx(timout=500) 我立即陷入了等待的僵局。然后我意识到MFC消息泵AfxInternalPumpMessage()只对阻塞调用有帮助,但对死锁情况没有任何帮助 然后我将P

执行STA线程同步最好的方法是什么

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

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

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

然后我将Peek/Translate/DispatchMessage代码添加到等待循环中,然后所有代码都工作了

现在,如果不手动编码Peek/Translate/DispatchMessage循环,您根本无法进行STA线程同步?任何等待呼叫都会使您死机。那么,同步STA线程的最佳或标准方法是什么


谢谢

不是任何等待,而是任何停止运行消息循环的等待都会使您死锁。解决方案是将等待循环和消息循环处理交织在一起—稍等一下,然后处理所有挂起的消息,重复。

也许您正在寻找

如果调用方驻留在单个线程中 单元,CoWaitForMultipleHandles进入COM模态循环,线程的 消息循环将继续发送 使用线程消息的消息 过滤器。如果未注册任何消息筛选器 对于线程,默认的COM 使用消息处理


你为什么要打电话给MsgWaitForMultipleObjectsEx?在第二个线程中,为什么不在消息完成后将其发布到第一个线程中?MsgWaitForMultipleObjectsEx不是可以配置为在消息添加到队列时返回的等待吗。GetMessage不是一个等待函数吗?@David Heffernan:不,如果你仔细阅读MSDN对该函数的描述,你会发现它没有被消息打断。我猜我读错了,但是QS_uuu唤醒掩码做什么了?@David Heffernan:是的,你是对的-该函数会在消息中返回,但无论如何,您必须自己发送消息: