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


你真的需要/想要一个指定的事件吗? 通常这只是进程间并发控制所必需的。

如果你有这个类的多个实例,它们将全部使用相同的事件 - 请参阅CreateEvent的文档以获得有关调用已存在的命名对象的文档。

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


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

  • 超时值已过
  • 事件发出信号
  • 句柄变为无效(在另一个线程中关闭)
  • 如果事件在您调用WaitForSingleObject时设置,则条件#2从一开始就为true,并且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"));
    }
    

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

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

    链接地址: http://www.djcxy.com/p/62469.html

    上一篇: WaitForSingleObject times out too fast

    下一篇: WaitForSingleObject and while loops in C/++