有时 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;
   }
}

最佳答案

由于您正在创建一个命名事件,因此知道该名称的其他进程可以访问该事件。另一个进程可能也在等待事件,导致它吃掉信号。除非由于某种原因需要其他进程看到该事件,否则您应该将 NULL 作为事件名称传递。这会创建一个其他进程无法访问的匿名事件。

请注意,如果给事件命名,那么您将遇到的问题是,如果您的程序的两个副本正在运行,它们都将使用相同的事件,这将产生同样的问题。

关于c - 为什么 WaitForSingleObject 会错过信号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15212450/

10-12 14:47
查看更多