我有一个带有多个线程的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()应该在关键部分内完成吗?或者仅仅是我的递归代码在递归到它不再调用自身的点上是不好的?
答案 0 :(得分:0)
汉斯在评论中提出,问题实际上是消息泵被阻止了。总是最好为可能需要很长时间的任务分配单独的线程,或者他们自己可能需要访问消息泵。