多个线程可以依赖于单个手动杀戮事件吗?

时间:2014-12-18 22:30:47

标签: multithreading recursion wait waitforsingleobject waitformultipleobjects

我有一个带有多个线程的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,则立即返回

并返回()。

fyi,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()应该在关键部分内完成吗?或者仅仅是我的递归代码在递归到它不再调用自身的点上是不好的?

1 个答案:

答案 0 :(得分:0)

汉斯在评论中提出,问题实际上是消息泵被阻止了。总是最好为可能需要很长时间的任务分配单独的线程,或者他们自己可能需要访问消息泵。