怎么样安全结束线程

zhongbin104 2010-11-03 11:24:49
问题请看链接:
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/34e6190f-1403-4c21-9f66-dc5395a6ea7f
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/34e6190f-1403-4c21-9f66-dc5395a6ea7f

我的问题是出在怎么样安全结束线程?而且是一个处在Sleep的线程。TerminateThread固然可以,但是内存泄漏严重。


问题解决了的,100分奉上。
...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongbin104 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tiger9991 的回复:]
我看了你的帖子
别用TerminateThread结束线程.
WaitForSingleObject中设置的infinite为啥不可以?采用信号量的关闭该进程不就可以了嘛
[/Quote]

主要是我的线程函数里面是调用了一个类。这个类里面有Sleep函数。。WaitForSingleObject这个加里面不能及时响应。
傻X 2010-11-03
  • 打赏
  • 举报
回复
我看了你的帖子
别用TerminateThread结束线程.
WaitForSingleObject中设置的infinite为啥不可以?采用信号量的关闭该进程不就可以了嘛
teleinfor 2010-11-03
  • 打赏
  • 举报
回复
sleep()用于线程函数不是一个好的选择。你的这种情况应该使用Event进行控制线程的结束。如果为了延时等待的需要可以设置等待超时时间。比如:

HANDLE hEvent[2];
hEvent[0] = ::CreateEvent(NULL,FALSE,FALSE,NULL);//用于退出
hEvent[1] = ::CreateEvent(NULL,FALSE,FALSE,NULL);//用于处理业务
while(TRUE)
{
DWORD dwWait = ::WaitForMultipleObjects(2,hEvent,FALSE,10000);//超时10s
switch(dwWait)
{
case WAIT_TIMEOUT:
break;
case WAIT_OBJECT_0:
//退出
break;
case WAIT_OBJECT_1:
break;
}
}

XXXX::Stop()
{
::SetEvent(hEvent[0]);//通知线程退出,这样线程就立刻退出了。
}
zhongbin104 2010-11-03
  • 打赏
  • 举报
回复
http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/34e6190f-1403-4c21-9f66-dc5395a6ea7f谢谢各位了。尽管现在的方法不是完美,但是还是自己想的一个方案。可以去看看。
「已注销」 2010-11-03
  • 打赏
  • 举报
回复
该回收的回收,该释放的释放,然后用你所知道的任意一种结束线程的方法结束就可以了.
founderfang 2010-11-03
  • 打赏
  • 举报
回复
teleinfor的解法不行吗?

15,471

社区成员

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

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