Может ли несколько потоков зависеть от одного ручного события Kill?
У меня есть код 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 инициализируется как:
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() выполняться внутри критического раздела или чего-то еще? Или это просто мой рекурсивный код, плохо возвращающийся к точке, в которой он больше не вызывает себя?
1 ответ
Как предложил Ганс в комментарии, проблема была в том, что насос сообщений был заблокирован. Всегда лучше назначать отдельные потоки для задач, которые могут занять много времени или могут сами нуждаться в доступе к набору сообщений.