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,则立即 return()。

仅供参考,h_killEvent 初始化为:

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

即,它具有手动重置功能。

但是,在我将 Kill-event 设置如下后,这些线程似乎需要(字面上)永远完成:

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() 是否应该在关键部分内完成?或者仅仅是我的递归代码不擅长递归到它不再调用自己的点?

4

1 回答 1

0

正如汉斯在评论中建议的那样,问题实际上在于消息泵被阻塞。始终最好为可能需要很长时间或本身可能需要访问消息泵的任务分配单独的线程。

于 2014-12-21T02:36:58.517 回答