hur.cn - 华软网

 热门搜索

为什么线程结束不了

  作者:未知    来源:网络    更新时间:2011/6/24
我用了SerialPort类开启线程来操作串口,但是发现有时候程序已经退出了,但是线程还是没有结束,而且这个进程在任务管理器当中竟然还存在,而且还结束不了,任务管理器也kill不了?
求解
---华软 网友回答---
串口阻塞了吧,你要先把串口给关掉,让等待在串口的函数返回
或者采用异步串口模式
---华软网友回复---
先结束线程,你那串口线程没退出,设置串口事件可以让串口退出。

---华软网友回复---
需要设置一下串口的超时读时间,你把串口读设置成读1个字符就返回。然后退出进程的时候,如果线程还没退出,就尝试先关闭串口,串口关闭以后便不再堵塞,即可退出。
---华软网友回复---
退出时调用 TerminateThread 函数强行退出
---华软网友回复---
C++">SetCommMask( g____hComm, EV_RXCHAR | EV_TXEMPTY );

---华软网友回复---
问题是都不知道是哪个线程没退出来,也不知道是不是串口线程?
程序每次运行的第一次会直接打开串口失败,退出程序后,任务管理器里面会出现一个进程mssxchx.exe的,直接kill掉以后,下次运行才会正常打开串口的。
但就这样,有时候还是不能完全退出,就是程序的线程当中最后会有一个或两个始终存在的,任务管理器都kill不了?
我都要吐血了,每次调试失败都要重启一下机器......
---华软网友回复---
SerialPort类开启的线程没有退出吧,修改SerialPort析构函数,添加TerminateThread
---华软网友回复---
一会好一会儿不好,看这个是我从CSerialPort类派生了一个自定义类,析构函数我也改了的:
C++">
void CComHelper::CloseComHelper()
{
if(m_bSuspend)
RestartMonitoring();

//while (m_bThreadAlive)
//SetEvent(m_hShutdownEvent); 
int counts = 0;
do   
    {   ++counts;
        SetEvent(m_hShutdownEvent);   
Sleep(100);
if(counts > 40)  //timeout is 4 seconds
{
m_bSuspend = FALSE; // compel to call resume function.
RestartMonitoring();
SetEvent(m_hShutdownEvent); 
Sleep(500);
if(m_bThreadAlive)
{
exit(1);
}
}
    } while (m_bThreadAlive); //这里都加了count了

CString str;
str.Format(L"\n****************COM%u Helper Thread Exits.******************\n",m_nPortNr);
//TRACE("COM-Helper Thread ended\n"); 
TRACE(str);

delete [] m_szWriteBuffer;
m_szWriteBuffer = NULL;
ModifyCacheLen(0);

//CloseHandle();
}

---华软网友回复---
强制线程退出,用exit(1)好吗?
---华软网友回复---
退出时强制结束线程
TerminateThread(pTheadFunc->m_hThread,0);
CloseHandle(pTheadFunc->m_hThread);
---华软网友回复---
在调试状态下(Debug)运行程序,然后退出程序,若程序如你所说没有真正退出。则点击暂停按钮,点击菜单打开两个窗口

菜单Debug->windows->Threads
菜单Debug->windows->Call Stack

通过这两个窗口观察到底在哪里死锁,导致没退出程序      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。