首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows WaitForMultipleObjects / MsgWaitForMultipleObjects差分

windows WaitForMultipleObjects / MsgWaitForMultipleObjects差分
EN

Stack Overflow用户
提问于 2020-05-10 06:51:05
回答 2查看 934关注 0票数 0

我试图理解MsgWaitForWaitFor函数之间的区别。

1)我知道MsgWaitFor在消息循环下运行,而WaitFor不运行?

2)对于需要在行中接收一系列事件的应用程序来说,MsgWaitFor函数更好吗?Windows是否对消息进行排队,这样应用程序就不会错过任何事件?假设应用程序希望接收频繁发生的事件AB。应用程序将打开一个线程:

代码语言:javascript
复制
while (1) {
  ret = WaitForMultipleObjects(...); // wait for events A and B
  if (ret == WAIT_OBJECT_0) {
    process_event();
  }
}

问题是,当线程忙于处理时,意味着它目前没有被WaitForMultipleObjects阻塞。在回到等待状态之前,线程如何避免丢失事件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-12 02:08:41

我试图理解MsgWaitFor和WaitFor函数之间的区别。

主要的区别是,除了以下对象类型之外,MsgWaitForMultipleObjects/MsgWaitForMultipleObjectsEx还可以等待消息(在消息队列中):

  • 变更通知
  • 控制台输入
  • 事件
  • 内存资源通知
  • 互斥
  • 流程
  • 信号量
  • 线程
  • 等待定时器

因此,如果您有一个创建窗口的线程,请使用MsgWaitForMultipleObjectsMsgWaitForMultipleObjectsEx,而不是WaitForMultipleObjectsEx

问题是,当线程忙于处理时,意味着它目前没有被WaitForMultipleObjects阻塞。在回到等待状态之前,线程如何避免丢失事件?

消息有队列,队列有长度(10,000条发帖信息)。因此,当处理消息太慢时,PostMessage可能会在ERROR_NOT_ENOUGH_QUOTA中失败。但是对于接收方来说,您不会错过消息,并且可以一个接一个地处理排队的消息。

事件对象没有队列,它有两种状态:signalednonsignaled设置已设置的事件没有任何效果。。因此,如果这是一个手动重置事件对象,它将保持为signaled,直到ResetEvent函数显式地将其设置为nonsignaled状态。可能会有失误在设置侧,而不是检查侧。

票数 0
EN

Stack Overflow用户

发布于 2020-05-10 09:59:20

MsgWaitForMultipleObjects[Ex]WaitForMultipleObjects[Ex]内部调用相同的api - KeWaitForMultipleObjects

将不同的in - MsgWaitForMultipleObjects[Ex]添加事件(在前面,在0索引处)添加到对象句柄数组。因为KeWaitForMultipleObjects将对象的最大数量限制为MAXIMUM_WAIT_OBJECTS,同样的限制也限制了MsgWaitForMultipleObjects[Ex]WaitForMultipleObjects[Ex]MAXIMUM_WAIT_OBJECTS - 1 (因为使用了附加的+1事件对象)

只存在2个WAIT_TYPE --或者是WaitAll,指示所有指定的对象必须在等待满足之前达到一个信号状态;或者是WaitAny,指示任何一个对象必须在等待满足之前达到一个信号状态。

当我们等待对象发出信号时--不重要的是在我们开始等待之前或之后处于信号状态的对象。反正我们也不会错过信号状态。当然,如果我们手动不重置对象,就不会再次发出信号状态。但这已经是程序逻辑的问题,与等待api无关。

连续发生的事件序列

这里不存在任何序列。每个对象都可以处于2种状态(信号状态或未信号状态),我们可以等待所有或任何处于信号状态的对象。如果您等待任何-哪个对象将首先得到信号取决于具体情况。

Windows是否对消息进行排队,这样应用程序就不会错过任何事件?

一点消息都没有。只存在包含DISPATCHER_HEADER (查看wdm.h)的对象。等待api检查SignalState of DISPATCHER_HEADER,如果它已经设置-返回控制(当然,如果我们等待单个对象或任何对象)。如果没有-将线程插入到WaitListHead (这是双链接列表,其中可以是多个线程,它们等待这个对象,并从win8 -WaitCompletionPacket的对象开始。当对象进入信号状态时(SignalState设置为非零)。system (SynchronizationEvent)或all (NotificationEvent,其他对象类型)在WaitListHead中等待线程(同样基于等待或等待任何)。万一WaitCompletionPacket -它排队到iocp

因此,再次-我们没有错过(如果不重新设置对象的自我)

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

https://stackoverflow.com/questions/61708235

复制
相关文章

相似问题

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