看来有时WaitForSingleObject
将等待超时,即使事件已发出信号。WaitForSingleObject为什么会错过一个信号?
信号线程每次从SetEvent()
收到成功。然而,被发信号的线程并不总是会听到信号。如果我向信号线添加冗余SetEvent()
,问题就会消失。
很明显,这里有什么不对劲。可能的原因是什么?
// Signalling Thread
if (SetEvent(waitEvent))
consoleprintf(L"\r\nEvent Set.");
而应该等待的延迟时间或得到通知。但并不总是显示信号。
waitEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event
FALSE, // initial state is nonsignaled
TEXT("WaitEvent") // object name
);
for(;;)
{
dwWaitResult = WaitForSingleObject(waitEvent, // event handle
5000);
switch (dwWaitResult)
{
// Event object was signaled
case WAIT_OBJECT_0:
consoleprintf(L"\r\nSuccess.");
break;
case WAIT_FAILED:
//break;
case WAIT_ABANDONED:
consoleprintf(L"\r\nWait failed.");
break;
case WAIT_TIMEOUT:
consoleprintf(L"\r\nWait Timed out: %d", waitTime);
break;
default:
break;
}
}
有问题的线程上的'ResetEvent'和'WaitForSingleObject'之间的侧线上没有'SetEvent'。这与您的描述和提及的行为的可能原因相匹配。 – 2013-03-04 22:40:14
另外,相反,在'WaitForSingleObject'之后立即调用'ResetEvent' - 否则在控制台打印期间发生的Set可能会被重置破坏。 – 2013-03-04 22:50:43
@ 500-InternalServerError即使事件被自动重置,也存在此问题。这仍然有意义吗? – MandoMando 2013-03-04 22:58:25