2012-04-25 75 views
3

我有這樣一段代碼在輔助線程:WaitForSingleObject的超時太快

DWORD result = WaitForSingleObject(myhandle,10000); 
if(result == WAIT_OBJECT_0){ 
    AfxMessageBox(_T(...)); 
} 
else if(result == WAIT_TIMEOUT){ 

    AfxMessageBox(_T("Timeout")); 
} 

有時候,並非總是如此,超時將得到幾乎只要WaitForSingleObject的被稱爲所謂的(甚至沒有1秒的延遲) 。

我做錯了什麼?任何建議更穩定的替代品?


編輯:

myhandle是一類構造器中創建爲:

myhandle = CreateEvent(NULL,FALSE,FALSE,_T("myhandle")); 

會由另一個函數被調用:

SetEvent(myhandle); 

點是它的工作原理時,我做SetEvent,問題是它有時會一旦WaitForSingleObjec就超時噸被稱爲,即使它應該等待10秒。

+0

你還在等什麼?我的手柄從哪裏來? – RedX 2012-04-25 13:55:02

+0

請參閱編輯:) ... – Smash 2012-04-25 14:07:55

+0

您在等待之前和之後檢查了GetLastError()嗎? – 2014-02-25 20:48:30

回答

0

一會兒拿了但問題實際上是該程序有時確實多次調用WaitForSingleObject。所以這是以前的呼叫超時。

解決方法是使用WaitForMultipleObjects,並在知道第一個事件不會被設置的情況下設置取消事件,因此定時器在重新調用之前被取消。

1

你真的需要/想要一個命名事件嗎?通常這只是進程間併發控制所必需的。

如果您有這個類的多個實例,它們將全部使用相同的事件 - 請參閱關於調用已存在的命名對象的docs for CreateEvent

這可能是你需要做的就是在這裏刪除名稱。這允許每個類實例擁有自己的對象,並且行爲應該更具可預測性。

+0

創建事件的類是一個單例。它從主視圖中設置:'Class :: instance() - > SetEvent()',其中代碼段是'SetEvent(myhandle);'我會嘗試你正在建議的CreateEvent(NULL,FALSE,FALSE,NULL) – Smash 2012-04-25 14:25:08

+0

是的,但只有在多次調用該代碼時纔有意義。你是否運行該程序的多個實例? – 2012-04-25 14:48:28

0

WaitForSingleObject不會等整整10秒。它會等待第一:

  1. 超時值經過
  2. 該事件標誌着
  3. 手柄變爲無效(在另一個線程關閉)

如果設置了事件當您撥打WaitForSingleObject時,條件#2從一開始就是真實的,WaitForSingleObject立即返回。

如果你想總是等待10秒鐘,你應該使用這樣的代碼:

//Always wait 10 seconds 
Sleep(10000); 

//Test the event without waiting 
if(WaitForSingleObject(myhandle, 0) == WAIT_OBJECT_0) { 
    AfxMessageBox(_T("Event was set in the last 10 secondes")); 
} else { 
    AfxMessageBox(_T("Timeout")); 
}