4

我在辅助线程中有这段代码:

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

    AfxMessageBox(_T("Timeout"));
}

有时,并非总是如此,几乎只要调用 WaitForSingleObject 就会调用超时(甚至不是 1s 延迟)。

难道我做错了什么 ?对更稳定的替代品有什么建议吗?


编辑:

myhandle在类构造函数中创建为:

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

它会被另一个函数调用:

SetEvent(myhandle);

关键是它在我执行 SetEvent 时有效,问题是它有时会在调用 WaitForSingleObject 时立即超时,即使它应该等待 10 秒。

4

3 回答 3

1

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"));
}
于 2012-04-25T15:20:17.037 回答
1

你真的需要/想要一个命名事件吗?通常这仅对进程间并发控制是必需的。

如果您有此类的多个实例,它们都将使用相同的事件 - 请参阅CreateEvent 的文档,了解调用已存在的命名对象。

您可能需要做的就是在此处删除名称。这允许每个类实例都有自己的Event对象,并且行为应该更可预测。

于 2012-04-25T14:11:41.930 回答
0

Took awhile but the problem actually was that the program sometimes did multiple calls to WaitForSingleObject. So it's a previous call that is timing out.

Solution is to use WaitForMultipleObjects and set a cancelling event in the case it is known that the first event won't be set, so the timer is cancelled before is it re-invoked.

于 2012-04-30T15:46:59.980 回答