2009-08-14 22 views
1

我创建3个事件具有以下功能:的Win32:获取一个事件对象的状态

HANDLE WINAPI CreateEvent(...); 

我等待所有bWaitAll设置为TRUE)事件对象或以超时:

DWORD WINAPI WaitForMultipleObjects(...); 

返回值是:

WAIT_TIMEOUT 

是否有一种简单的方法来检查每个事件以找出哪个(哪些)没有设置?

作为一个例子:

HANDLE evt1 = .... 
HANDLE evt2 = .... 
HANDLE evt3 = .... 

HANDLE evts[3] = .... 

DWORD ret = ::WaitForMultipleObjects(3, evts, TRUE, 10000); 

10秒后:

  • '保留' 是WAIT_TIMEOUT。
  • EVT1设置
  • EVT2未设置
  • EVT3设置

返回值告诉我:“超时间隔已过,由bWaitAll参数指定的条件不成立。” ,但不是哪一个被发出信号,哪一个不是。

感谢,

回答

3

是,WaitForMultipleObjects的()后返回调用WaitForSingleObject()为每个事件指定零超时。

它将针对未发送信号的事件返回WAIT_TIMEOUT,针对发送信号的事件返回WAIT_OBJECT_0。不要忘记检查WAIT_FAILED。

当然,与WaitFormultipleObjects()返回时的状态相比,每个事件状态都可能发生了变化。

+2

这种打败WaitForMultipleObjects的目的! – 2009-08-14 13:53:50

+1

既然这已被接受,我应该在这里重复我的警告,这将实际*更改某些Sync对象的状态*。例如,如果您的“检查”成功完成互斥锁,那么您也将获得互斥锁的所有权。 – 2009-08-21 17:42:41

+0

anon - 不是。您可以等待多个对象,然后使用等待单个对象来确定要设置哪个对象。 – 2013-01-04 22:39:03

-1

如果调用返回WAIT_TIMEOUT这意味着你等待的对象都不是信号..

+0

如果他的等待全部设置为假,但他似乎等待所有设置为真(他说他等待所有事件),情况就是这样。 – sharptooth 2009-08-14 13:53:53

+0

那么如果他正在等待他们所有的信号,并返回WAIT_TIMEOUT,他们并不是所有的信号,他应该等待,直到他们。无论是或者,如你所说,使用waitAll设置为false。 – 2009-08-14 14:01:29

+0

+1,我的错误:我不够清楚。我想知道WAIT_TIMEOUT返回后哪个事件失败。 – Nicolas 2009-08-14 14:03:47

2

确定。在提出问题之后,对问题进行了全面改写。

因此,如果我现在正在理解这一点,那么您将调用WaitForMultipleObjects并将bWaitAll设置为true,并且当您从中获取WAIT_TIMEOUT时,要弄清楚哪些对象阻止了作品。

在这种情况下,我很锐利。您可以为每个对象调用WaitForSingleObject 0超时。这样做的问题是它对某些对象有副作用。例如,如果你在互斥量上做了这个并且成功了,你不仅知道它不是罪魁祸首,而且你现在拥有互斥量。如果这不是你想要的,你必须知道立即释放它。

您采取的任何应对措施都将受到竞争条件的限制。由于您不在“原子”等待电话之外,因此您可以通过该过程并发现现在他们已经准备就绪。你可以找回一组准备好/未准备好的东西,这不是你在等待电话中真正拥有的东西。

Ick。

+0

它告诉我哪个对象变成了信号,如果我在FALSE中使用带有“bWaitAll”的函数,但是我将它与“bWaitAll”在TRUE中一起使用。 – Nicolas 2009-08-14 14:17:06

0

这项工作的无,如WaitForSingleObject的,即使超时是0

(相反的是MSDN说)()将触发自动重置事件。

相关问题