0

다른 매개 변수를 사용하여 모든 서브 루틴을 반복적으로 호출하는 다중 스레드가있는 MFC 코드가 있습니다. 서브 루틴의 시작 부분에서 , 나는 전화가 CheckKillEvent()을 작동 할 수 있도록 :여러 스레드가 하나의 수동 킬 이벤트에 의존 할 수 있습니까?

bool CTestShellDlg::CheckKillEvent() 
{ 
    DWORD waitS; 
    waitS = WaitForSingleObject(h_KillEvent, 0); 
    switch (waitS) 
    { 
    case WAIT_OBJECT_0: 
     return true; 
     break; 
    case WAIT_TIMEOUT: 
     return false; 
     break; 
    default: 
     IERROR 
      break; 
    } 
} 

및 리턴() CheckKillEvent가 true를 돌려주는 경우 즉시.

h_KillEvent = CreateEvent(NULL, true, false, NULL); 

즉, 그것은 수동 리셋이 있습니다로

참고로, h_killEvent가 초기화됩니다.

그러나, 이러한 스레드가 나는 아래와 같은 킬 이벤트 설정 한 후 완료 영원히 (문자 그대로) 걸릴 것 : 질문은

bool CTestShellDlg::KillThreads() 
{ 
     //Signall the killing event 
     SetEvent(h_KillEvent); 
     if (WaitForMultipleObjects(,,true,)==...) 
     { 
      ResetEvent(h_KillEvent); 
      return true; //Killing successful 
     } 
    else 
     return false; //Killing failed 
} 

를 여러 스레드에서 CheckKillEvent()를 호출에 문제가있다 ? WaitForSingleObject()가 중요한 섹션이나 다른 것 안에서 처리되어야합니까? 아니면 단순히 내 재귀 코드가 더 이상 자신을 호출하지 않는 지점으로 되 돌리는 데 좋지 않습니까?

+0

아니요, 이런 종류의 코드는 일반적으로 정상적으로 작동합니다. CheckKillEvent()를 호출하지 않는 운영 체제 호출에 스레드가 걸리면 차단됩니다. 디버거의 Threads 창에서 쉽게 찾을 수 있습니다. –

+0

감사합니다. 그래, 일부 디버깅 후 작동 있어요. 그 주석을 답으로 추가하고 싶을 수도 있습니다. –

답변

0

한스가 의견에서 제안했듯이 문제는 실제로 메시지 펌프가 차단 된 것이 었습니다. 오랜 시간이 걸리거나 메시지 펌프에 대한 액세스가 필요한 작업에 별도의 스레드를 할당하는 것이 가장 좋습니다.

관련 문제