即使事件已发出信号,有时候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;
}
}
答案 0 :(得分:15)
由于您正在创建命名事件,因此知道名称的其他进程可以访问该事件。其他过程也可能在等待事件,导致它吃掉信号。除非有某些原因导致事件需要对其他进程可见,否则应将NULL
作为事件名称传递。这会创建一个其他进程无法访问的匿名事件。
请注意,如果给事件命名,那么您将面临一个问题,即如果程序的两个副本正在运行,它们将使用相同的事件,这将产生同样的问题。