0

У меня есть код MFC с несколькими потоками, которые делают рекурсивные вызовы подпрограмме с разными параметрами. В начале подпрограммы, я делаю вызов функции CheckKillEvent():Может ли несколько потоков зависеть от одного ручного события Kill-event?

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 возвращает истину.

FYI, h_killEvent инициализируется как:

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

т.е. имеет ручной сброс.

Однако эти нити, кажется, берет (в буквальном смысле) навсегда закончить после того, как я установил Kill-событие, как показано ниже:

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

Как указал Ханс в комментарии, проблема заключалась в том, что сообщение было заблокировано. Всегда лучше назначать отдельные потоки для задач, которые могут занять много времени или могут сами нуждаться в доступе к насосу сообщений.