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

发布于 2024-11-17 03:09:04 字数 473 浏览 4 评论 0原文

最好的办法是做STA线程同步?

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

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

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

然后我将 Peek/Translate/DispatchMessage 代码添加到等待循环中,然后一切正常。

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

谢谢!

What is the best was to do STA thread synchronization?

I have a dialog based MFC application with two STA threads: the main and the second. I created the COM object in the main UI thread.

I call the COM interface from the second thread. In the main thread, to make sure the second thread finishes before the main thread proceeds, I use a loop to wait for the thread. This loop calls MsgWaitForMultipleObjectsEx(timout=500) looply.

I immediately got deadlocked on the wait. Then I realized that the MFC message pump, AfxInternalPumpMessage(), only helps with blocking calls but doesn't help at all with deadlock situations.

Then I added Peek/Translate/DispatchMessage code into the wait loop and then all worked.

Now, it seems that without hand coding the Peek/Translate/DispatchMessage loop, you can't do STA threads synchronization at all? Any wait call will deadlock you. Then what's the best or standard way to synchronize STA threads?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

無心 2024-11-24 03:09:04

也许您正在寻找 CoWaitForMultipleHandles

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

Perhaps you are looking for CoWaitForMultipleHandles?

If the caller resides in a single-thread
apartment, CoWaitForMultipleHandles enters the COM modal loop, and the thread's
message loop will continue to dispatch
messages using the thread's message
filter. If no message filter is registered
for the thread, the default COM
message processing is used.

∞琼窗梦回ˉ 2024-11-24 03:09:04

不是任何等待,而是任何停止运行消息循环的等待确实会使您陷入僵局。解决方案是将等待循环和消息循环处理交错 - 稍等一下,然后处理所有待处理的消息,然后重复。

Not any wait, but any wait that stops running the message loop will indeed deadlock you. The solution is to interleave your wait loop and message loop processing - wait a little, then process all pending messages, repeat.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文