我在辅助线程中有这段代码:
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秒。
答案 0 :(得分:1)
你真的需要/想要一个命名活动吗?通常,这仅用于进程间并发控制。
如果你有这个类的多个实例,他们都将使用相同的事件 - 请参阅docs for CreateEvent有关调用已存在的命名对象的信息。
您可能需要做的就是在此处删除名称。这允许每个类实例拥有自己的Event
对象,并且行为应该更具可预测性。
答案 1 :(得分:0)
WaitForSingleObject
不会等待整整10秒钟。它将等待第一个:
如果在您致电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
并在知道不会设置第一个事件的情况下设置取消事件,因此在重新调用之前取消定时器。