WaitForSingleObject超时太快

时间:2012-04-25 13:51:10

标签: c++ winapi

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

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时有效,问题是它一旦调用WaitForSingleObject就会超时,即使它应该等待10秒。

3 个答案:

答案 0 :(得分:1)

你真的需要/想要一个命名活动吗?通常,这仅用于进程间并发控制。

如果你有这个类的多个实例,他们都将使用相同的事件 - 请参阅docs for CreateEvent有关调用已存在的命名对象的信息。

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

答案 1 :(得分:0)

WaitForSingleObject不会等待整整10秒钟。它将等待第一个:

  1. 超时值已过去
  2. 该事件已发出信号
  3. 句柄变为无效(在另一个帖子中关闭)
  4. 如果在您致电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"));
    }
    

答案 2 :(得分:0)

花了一段时间,但问题实际上是该程序有时会对WaitForSingleObject进行多次调用。所以这是一个超时的呼叫。

解决方法是使用WaitForMultipleObjects并在知道不会设置第一个事件的情况下设置取消事件,因此在重新调用之前取消定时器。