首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoResetEvent和COM对象

AutoResetEvent和COM对象
EN

Stack Overflow用户
提问于 2009-09-28 23:31:05
回答 3查看 604关注 0票数 0

我注意到,AutoResetEvent在WaitOne()调用过程中完全冻结了消息循环(有时),甚至有效地阻塞了信号消息。

IE:

  1. (UI)生成新线程
  2. (UI)代码调用WaitOne();超时:10
  3. (T2)线程打开设备,调用Set()
  4. (UI) WaitOne块消息循环
  5. (UI)经过WaitOne超时,代码执行继续进行
  6. (UI)主窗口接收信号并继续(但WaitOne失败)

有什么想法吗?

编辑:添加UI/T2以指定线程。另外,我正在尝试将第三方库转换为同步库。打开设备涉及一个Open()调用,这个调用反过来会产生一个OpenOK或OpenFailed事件,我正在尝试创建一个bool ()调用,根据生成的事件返回true/false。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-29 02:41:33

..。有效地阻断了信号信息。

您不能“阻止一个信号”被发送,您只能阻止另一个线程到达设置事件的点。等待句柄根本不需要消息泵。

我唯一能想到的可能是,所讨论的COM对象被绑定到UI线程。访问COM对象可能试图从T2调用回UI线程,该线程正在等待T2做一些事情(死锁)。要查看这是否确实是问题所在,请确保没有在UI线程上创建或访问COM对象。

票数 1
EN

Stack Overflow用户

发布于 2009-09-28 23:52:57

这是比赛条件的结果。问题是,步骤3可能发生在步骤2之前,因为它们位于不同的线程上。因为您使用的是AutoResetEvent,所以在调用WaitOne时,事件已经被重置。

由于这个问题,只要有可能,我通常都会尽量避免使用AutoResetEvents来支持ManualResetEvents。

使用ManualResetEvent的事件顺序是(我已经将事件2列为2a和2b,以证明它们的操作顺序没有得到保证):

  1. 新线程
  2. 原始线程调用WaitOne();b.新线程调用Set();
  3. 原来的线醒了。
  4. 原始线程调用Reset();
票数 0
EN

Stack Overflow用户

发布于 2009-09-29 01:19:52

您可能会发现,所以在“等待主线程同时继续处理”上发布

还签出了MSDN的异步调用同步方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1489859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档