mfc中使用SuspendThread无法挂起线程

来源:百度知道 编辑:UC知道 时间:2024/09/21 15:25:11
问题:
我在自己建的一个线程中,使用SuspendThread挂起该线程,然后5ms之后通过另外一个线程唤醒。可是,发现SuspendThread无法挂起该线程。可是在同一个线程之中,在一个判断中使用SuspendThread就可以挂起该线程。谁能讲解一下原因?

程序:
DWORD WINAPI ThreadDispEcg(LPVOID IDData)
{
CInforDispDlg* plg=(CInforDispDlg*)IDData;

while (TRUE)
{
// Thread state check
switch (plg->ThreadState)
{
case THREADSTATE_RESUME:
plg->DispEcgInfor(plg->pDC);
(这个函数里有用SetTimer设置5ms的唤醒)
// Suspend Thread
SuspendThread(plg->ThreadHandle_DispEcg);
break;
case THREADSTATE_SUSPEND:
if (plg->EcgCnt != plg->DispCnt)
{
SuspendThread(plg->ThreadHandle_DispEcg);
}
break;
case THREADSTATE_TERMINATE:
return FALSE;
}
}
return TRUE;
}
……
……
void CInforDispDlg::OnTimer(UINT nIDEvent)
{
// TODO

你是做医疗器械的吗?在做监护仪程序??

SuspendThread 的原形是:DWORD SuspendThread(HANDLE hThread);它返回的是线程的前一个暂停记数.线程暂停的次数可以是MAXIMUM_SUSPEND_COUNT次(在WINNT.H中是127);SuspendThread与内核方式的执行是异步的,但是在线程恢复运行之前,不会发生用户方式的执行。调用SuspendThread必须小心,如果线程试图从堆栈中分配内存,那么该线程将在该线程上设置一个锁,当其他线程试图访问该堆栈时,这些线程的访问就被停止,直到第一个线程恢复运行,只有知道目标线程在干什么时,并且采取强有力的措施避免因暂停线程带耒的问题或死锁状态,SuspendThread才是安全的。

为何要让线程挂起自己呢~~让它Sleep 50ms不行吗?