3

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;
   }
}
4

1 に答える 1

15

名前付きイベントを作成しているため、名前を知っている他のプロセスからイベントにアクセスできます。その他のプロセスもイベントを待機している可能性があり、シグナルを消費します。イベントを他のプロセスに表示する必要がある何らかの理由がない限りNULL、イベント名として渡す必要があります。これにより、他のプロセスがアクセスできない匿名イベントが作成されます。

イベントに名前を付けると、プログラムの 2 つのコピーが実行されている場合、両方が同じイベントを使用するという問題が発生し、同じ問題が発生することに注意してください。

于 2013-03-04T23:33:14.920 に答える