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
并在知道第一个事件不会被设置的情况下设置取消事件,因此定时器在重新调用之前被取消。