Может ли несколько потоков зависеть от одного ручного события 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 ответ

Решение

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

Другие вопросы по тегам