CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

请问结束线程时怎样收回线程的资源?

楼主yalechenfly(风轻云淡)2005-09-24 11:15:58 在 VC/MFC / 进程/线程/DLL 提问

用AfxBeginThread开始线程,用TerminateThread结束线程后,在重新开始线程(AfxBeginThread)时发现内存使用总是有很大的增大,请问怎样收回线程的资源? 问题点数:30、回复次数:12Top

1 楼zxyjyzxyjy(猜)回复于 2005-09-24 11:35:09 得分 3

使线程正常退出,如在线程中检测某一全局的变量来决定退出,并做好清理工作,不要用TerminateThread函数终止线程。Top

2 楼seansoe(www.sysmgmt.com.cn)回复于 2005-09-24 11:42:16 得分 3

在线程函数里调用AfxEndThread()来正常的结束线程,可以释放相关线程资源。TerminateThread()属于强制结束,线程相关资源没有释放。Top

3 楼lianglp(寻找黄金分割点)回复于 2005-09-24 11:42:45 得分 3

ExitThread,或让线程自已退出线程处理过程。  
  除非不得已用TerminateThread(),希望不要这样,因为用这个函数结束线程,  
  一些资源不会释放,除非进程结束,比如堆栈等不会释放,所以你的内存就增加了。Top

4 楼yalechenfly(风轻云淡)回复于 2005-09-24 14:41:03 得分 0

谢谢各位,可是我是要在线程外部强制结束线程呀,若用AfxEndThread能不能不放在UINT   MyThread(LPVOID   pParam)线程函数内部呢?Top

5 楼seansoe(www.sysmgmt.com.cn)回复于 2005-09-24 15:42:14 得分 4

要想线程释放资源必须正常结束,通常是在线程中调用WaitForSingleObject(hEvent...),即去检查一个Event内核对象是否到了Signald状态,如果是则正常退出。外部线程如果想让该线程退出,应该通过SetEvent(hEvent)通知该线程,让其自己退出,而不是在外部TerminateThread().Top

6 楼yalechenfly(风轻云淡)回复于 2005-09-24 17:21:05 得分 0

好的,多谢   seansoe多谢大家,我去实验Top

7 楼yalechenfly(风轻云淡)回复于 2005-09-24 17:21:31 得分 0

同时有好的建议请go   onTop

8 楼yalechenfly(风轻云淡)回复于 2005-09-24 18:26:33 得分 0

请问seansoe有没有一个例子呀?Top

9 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-09-24 18:45:11 得分 1

要正常退出线程,释放资源等Top

10 楼Delphityro(下岗工人)回复于 2005-09-26 19:44:09 得分 1

正常结束才能释放资源。  
  主线程通常要等待Top

11 楼Atomictry(天影)回复于 2005-09-27 10:16:03 得分 10

//   流程  
  1.   volatile   BOOL   bThreadState   =   FALSE;   //   全局    
        HANDLE   m_hTermThreadEvent;                     //   成员  
   
  2.   CYourDlg::CYourDlg()  
  {  
          m_TreadState   =   FALSE;    
          m_hTermThreadEvent   =   NULL;    
  }  
   
  3.   CYourDlg::OK()  
  {  
          if   (bThreadState)   //   Thread   Start...  
                  return;    
          AfxBeginThread(ProcessPackThread,   this,   THREAD_PRIORITY_BELOW_NORMAL);    
  }  
   
  4.   UINT   ProcessThread(LPVOID   lpParam)  
  {  
          CYourDlg   *pDlg   =   (CYourDlg   *)   lpParam;    
          if   (NULL   ==   pDlg)    
                  return   0;  
   
          while(TRUE)  
          {  
                  Sleep(100);  
                  if   (!bThreadState)    
                  {  
                          SetEvent(pDlg->m_hTermThreadEvent);    
                          return   0;    
                  }  
          }  
          return   1;  
  }  
   
  5.   CYourDlg::OnCancel()  
  {  
          if   (bThreadState)    
          {  
                  bThreadState   =   FALSE;    
                  if   (NULL   !=   m_hTermThreadEvent)    
                          ResetEvent(m_hTermThreadEvent);    
                  else  
                          m_hTermThreadEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);    
                  WaitForSingleObject(m_hTermThreadEvent,   INFINITE);    
          }  
          CDialog::OnCancel();  
  }Top

12 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-09-27 14:16:59 得分 5

应该给线程一个出口条件。  
  如果没有出口条件,那么线程内用户分配的资源AfxEndThread也不能正确释放。  
  AfxEndThread只保证与线程有关的系统资源的释放。Top

相关问题

  • 请问如何收回线程所占的资源
  • 用AfxBeginThread开启的线程怎样结束后释放资源?
  • 从线程外部结束线程
  • 父线程怎样结束子线程?
  • 如何有效的强制结束运行的线程,释放资源?
  • 线程的资源释放
  • 关于线程的结束!
  • 如何结束线程?
  • 线程如何结束
  • 线程如何结束?

关键词

  • 线程
  • 函数
  • null
  • htermthreadevent
  • bthreadstate
  • cyourdlg
  • 资源
  • 释放
  • terminatethread
  • afxendthread

得分解答快速导航

  • 帖主:yalechenfly
  • zxyjyzxyjy
  • seansoe
  • lianglp
  • seansoe
  • oyljerry
  • Delphityro
  • Atomictry
  • DentistryDoctor

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo