2009-08-14 18 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說)()將觸發自動重置事件。

相關問題