2013-03-04 1 views
3

이벤트가 신호를 받았음에도 불구하고 때때로 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; 
    } 
} 
+0

문제의 스레드에서 'ResetEvent'와 (과) WaitForSingleObject 사이의 사이드 스레드에는 SetEvent가 없습니다. 이것은 귀하의 설명과 언급 된 행동의 가능한 이유와 일치합니다. –

+2

반대로,'WaitForSingleObject' 바로 다음에'ResetEvent'를 호출하십시오. 그렇지 않으면 콘솔 프린트 중에 발생하는 Set이 Reset에 의해 clobbered 될 수 있습니다. –

+0

@ 500-InternalServerError 이벤트가 자동 재설정 된 경우에도이 문제가있었습니다. 아직도 이해가 되겠습니까? – MandoMando

답변

14

명명 된 이벤트를 만들므로 이름을 알고있는 다른 프로세스에서 이벤트에 액세스 할 수 있습니다. 그 다른 프로세스가 이벤트를 기다려서 신호를 먹을 수도 있습니다. 이벤트가 다른 프로세스에서 볼 수 있어야하는 이유가없는 한 NULL을 이벤트 이름으로 전달해야합니다. 이는 다른 프로세스가 액세스 할 수없는 익명의 이벤트를 만듭니다.

이벤트에 이름을 지정하면 두 개의 프로그램 사본이 실행중인 경우 모두 동일한 이벤트를 사용하므로 동일한 문제가 발생한다는 점에 유의하십시오.

+0

일반적인 오류입니다. NT4 일 동안 냄새를 맡기는 데 사용되는 CreateEvent 설명서. – Joshua