在线程外面终止线程的问题

downstar 2005-09-07 04:09:43
UINT COPration ::Mythread(LPVOID pParam)//COPration 是纯虚基类
{
COPration *P = (COPration *)pParam;
while(true)
{
if(p->m_Com.GetBufferCount>0)
return 0;
}
}
bool COldmeter::Read()//COldmeter是从COPration派生来的
{
.
.
CWinThread *pThread = AfxBeginThread(Mythread,this);
.
.
if(pThread->m_hThread != NULL)
{
DWORD ExitCode;
GetExitCodeThread(pThread->m_hThread,&ExitCode);
ExitThread(ExitCode);
}
.
.
}
上述部分是在动态库里面实现。主应用程序通过接口类调用动态库里面的函数。
问题是,但我在调用ExitThread(ExitCode);结束线程的时候,我的主应用程序界面竟然消失了,结果在任务管理器里面发现主应用程序却还在执行。
这是怎么回事啊,我只是想结束本线程而已,不知道我的处理有问题没有。大家有什么解决办法没有????
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
downstar 2005-09-07
  • 打赏
  • 举报
回复
谢谢大家的意见,我也是初次学线程.问题明白了!
但是我的Mythread(LPVOID pParam)线程函数的主要任务是不断的查询串口有没有返回数据,我用的是
MFC自带的CMScomm 控件,所以如果改成 WaitforSingleObject(hEvent)来替换While(true),
那么当前的线程会被挂起,而不能执行 p->m_Com.GetBufferCount>0 去查询串口了。
我先看看同步!
nelsonc 2005-09-07
  • 打赏
  • 举报
回复
楼上正确,ExitThread是退出当前线程,也就是你结束了主线程,所以程序就结束了。
GetExitCodeThread并不是等到线程结束才返回的。
亿云力科技 2005-09-07
  • 打赏
  • 举报
回复
ExitThread()是退出当前线程,应该在MyThread()中调用。
在MyThread()中用WaitforSingleObject(hEvent)来替换While(true),在主线程中CreateEvent,在需要结束线程时SetEvent().
feelmoon 2005-09-07
  • 打赏
  • 举报
回复
GetExitCodeThread(pThread->m_hThread,&ExitCode);
当这个有返回时,你等待的那个线程已经结束了,你再调用ExitThread(ExitCode),你去查MSDN,此API将结束调用它的线程!这样你的动态库可能还没来得及释放某些东西,导致主程序无提示的崩溃,只所以管理器里还存在,可能是你主程序的某个线程还没退出吧!

如果要在线程外中止某个线程,可通过同步控制使线程return,其实你写的这个线程,只有它执行完所有代码或遇到return的时候,就自动的结束了,当然,要注意在线程函数的最后释放资源,否则会出现内存泄露的!
gohappy_1999 2005-09-07
  • 打赏
  • 举报
回复
ExitThread(ExitCode);
是退出调用线程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧