我试图理解MsgWaitFor和WaitFor函数之间的区别。
1)我知道MsgWaitFor在消息循环下运行,而WaitFor不运行?
2)对于需要在行中接收一系列事件的应用程序来说,MsgWaitFor函数更好吗?Windows是否对消息进行排队,这样应用程序就不会错过任何事件?假设应用程序希望接收频繁发生的事件A和B。应用程序将打开一个线程:
while (1) {
ret = WaitForMultipleObjects(...); // wait for events A and B
if (ret == WAIT_OBJECT_0) {
process_event();
}
}问题是,当线程忙于处理时,意味着它目前没有被WaitForMultipleObjects阻塞。在回到等待状态之前,线程如何避免丢失事件?
发布于 2020-05-12 02:08:41
我试图理解MsgWaitFor和WaitFor函数之间的区别。
主要的区别是,除了以下对象类型之外,MsgWaitForMultipleObjects/MsgWaitForMultipleObjectsEx还可以等待消息(在消息队列中):
因此,如果您有一个创建窗口的线程,请使用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx,而不是WaitForMultipleObjectsEx。
问题是,当线程忙于处理时,意味着它目前没有被WaitForMultipleObjects阻塞。在回到等待状态之前,线程如何避免丢失事件?
消息有队列,队列有长度(10,000条发帖信息)。因此,当处理消息太慢时,PostMessage可能会在ERROR_NOT_ENOUGH_QUOTA中失败。但是对于接收方来说,您不会错过消息,并且可以一个接一个地处理排队的消息。
事件对象没有队列,它有两种状态:signaled和nonsignaled。设置已设置的事件没有任何效果。。因此,如果这是一个手动重置事件对象,它将保持为signaled,直到ResetEvent函数显式地将其设置为nonsignaled状态。可能会有失误在设置侧,而不是检查侧。
发布于 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
因此,再次-我们没有错过(如果不重新设置对象的自我)
https://stackoverflow.com/questions/61708235
复制相似问题