CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

如何真正释放一个动态创建的线程??在线等!!

楼主talkingmute(CS-{Z})2006-06-02 09:29:35 在 C++ Builder / 基础类 提问

通过TThread派生了自己的线程类TMyThread,在程序的某个地方需要动态创建一个线程的变量,就是说程序每执行到那个地方都要创建一个线程,我是这样写的:  
  TMyThread   *MyThread=new   TMyThread(false);  
  MyThread->FreeOnTerminate=true;  
   
  而在线程的Execute()函数的最后,我也加入了这样的几句:  
  Terminate();  
  WaitFor();  
  delete   this;  
   
  可是通过系统的任务管理器看,程序的线程数是一直增长的,而且使用的内存也不见减小,即动态创建的线程并没有释放掉资源,请问大家,我上边那样写是哪里有问题了???  
   
   
  问题点数:50、回复次数:40Top

1 楼netsys2(来电!)回复于 2006-06-02 09:45:45 得分 0

退出时Terminate();就够了。Top

2 楼talkingmute(CS-{Z})回复于 2006-06-02 09:58:01 得分 0

谢谢,可是那样写,线程数目是一直增长的,不见少啊  
  因为当初是动态创建它的Top

3 楼talkingmute(CS-{Z})回复于 2006-06-02 10:21:25 得分 0

急啊,怎么没人来帮助下啊!!!Top

4 楼xpdavis(咕嘟-不想孤独)回复于 2006-06-02 10:24:10 得分 0

而在线程的Execute()函数的最后,我也加入了这样的几句:  
  Terminate();  
  WaitFor();  
  delete   this;  
   
  这些不需要,你只要退出函数就可以了Top

5 楼qsgmail(qsgmail)回复于 2006-06-02 10:30:18 得分 0

楼上正解Top

6 楼talkingmute(CS-{Z})回复于 2006-06-02 10:42:15 得分 0

to:xpdavis(咕嘟)  
   
  这些不需要,你只要退出函数就可以了??  
   
  是在哪里退出函数??退出线程的Execute函数?还是在创建线程的函数里退出??  
  创建线程的函数是在一个响应事件里,我就按照上边那样写的直接创建了个线程,其他都没做。Top

7 楼xpdavis(咕嘟-不想孤独)回复于 2006-06-02 12:37:36 得分 0

退出Execute函数Top

8 楼talkingmute(CS-{Z})回复于 2006-06-02 12:46:46 得分 0

Execute函数??  
  如何退出?到函数的最后,什么都不写吗??Top

9 楼xpdavis(咕嘟-不想孤独)回复于 2006-06-02 13:14:43 得分 0

对Top

10 楼xiaoshi0(Rain)回复于 2006-06-02 13:24:57 得分 0

你只需要退出线程类的Execute函数就可以了  
   
  其他的撤销线程操作已经由线程类的析构函数帮你做好了  
  Top

11 楼talkingmute(CS-{Z})回复于 2006-06-02 13:38:24 得分 0

谢谢,我就是什么都不做了,可是任务管理器看到线程数目依然在增长,不见少啊  
  这到底是该怎么释放呢??Top

12 楼cczlp(不惑)回复于 2006-06-02 14:12:34 得分 0

在Execute()中什么都不写试试,   看看是不是Execute的问题Top

13 楼talkingmute(CS-{Z})回复于 2006-06-02 14:42:42 得分 0

to:cczlp(不惑)  
  谢谢,是Execute()函数写的有问题了,去掉它后,就没事了~  
   
  Execute()函数里我写的是,传递进来一个TCustomWinSocket   *Socket,然后通过这个Socket发送一些字符串,发完后设置10秒的等待Sleep(10000),10秒等待后再发送一些字符串,直到最后,Execute()退出。  
   
  请问,最根本的导致线程增加的原因是这哪个呢?TCustomWinSocket   *Socket,它吗?还是10秒的等待??Top

14 楼talkingmute(CS-{Z})回复于 2006-06-02 14:49:15 得分 0

可算找到罪魁祸首了!!!  
  是那个Sleep函数!!!  
  可是,该如何解决呢,我想通过Socket发送一些字符串后能等待一小会,再发送一些,该通过什么方法呢??Top

15 楼cczlp(不惑)回复于 2006-06-02 14:50:22 得分 0

怀疑和TCustomWinSocket有关,   不知是不是它又创建了线程没释放,  
  这个控件我不清楚,   等等看别人怎么说.Top

16 楼cczlp(不惑)回复于 2006-06-02 14:51:44 得分 0

怎么会是Sleep呢,   不明白Top

17 楼talkingmute(CS-{Z})回复于 2006-06-02 14:55:57 得分 0

是Sleep的,我把Slepp去掉之后,线程就不再增长了~~~  
  刚才查了下,线程里调用Sleep就是让线程挂起的,可是时间到时,线程又不会自动恢复过来,这该怎么做呢???  
  Top

18 楼talkingmute(CS-{Z})回复于 2006-06-02 15:03:35 得分 0

或者有没什么方法,让线程能在执行中等待一段时间后再执行呢??Top

19 楼Maconel(Maconel)回复于 2006-06-02 15:04:18 得分 0

应该不会是Sleep的问题吧。  
  把socket有关的代码删掉,留下sleep,看怎么样。Top

20 楼talkingmute(CS-{Z})回复于 2006-06-02 15:18:46 得分 0

是Sleep的的问题,我把socket有关的代码删掉依然增长,把sleep删掉,线程就不再增长了~~  
  Top

21 楼talkingmute(CS-{Z})回复于 2006-06-02 16:58:24 得分 0

线程中不能用sleep吗?  
  那如果不能用,还有没其他方法可以让线程等待一段时间再执行呢??  
  急!怎么没人了?Top

22 楼xiaoshi0(Rain)回复于 2006-06-02 18:10:00 得分 0

线程中是可以用Sleep函数的  
   
  那要看你的Execute函数是怎么写的了Top

23 楼satan39()回复于 2006-06-03 09:53:22 得分 0

最好别用sleep,使用windows的句柄来搞  
  //延迟1秒  
                HANDLE   Event;  
                Event   =   CreateEvent(NULL,   true,   false,   NULL);  
                WaitForSingleObject(Event,   1000);  
                CloseHandle(Event);Top

24 楼yunqi_1979(金戈戎装)回复于 2006-06-04 20:54:05 得分 0

if(Event   !=   NULL)  
  {  
            CloseHandle(Event);  
  }  
  Top

25 楼wenyongjie(我们的目标是:没有蛀牙!!)回复于 2006-06-05 23:22:05 得分 0

MARKTop

26 楼flowercity(菜农)回复于 2006-06-06 08:43:21 得分 0

markTop

27 楼whbo(王红波(年轻人,要有所作为))回复于 2006-06-08 10:33:53 得分 0

::_endThread()Top

28 楼rester214(呆呆中)回复于 2006-06-08 10:45:59 得分 0

学习~Top

29 楼GodBirdFlying(飞翔天堂鸟)回复于 2006-06-08 13:00:43 得分 0

mark   tooTop

30 楼cleansunshing(努力学习中)回复于 2006-06-08 15:35:53 得分 0

mark   tooTop

31 楼sanyou98(sanyou98)回复于 2006-06-08 16:35:01 得分 0

markTop

32 楼cuteant(我这张旧床票还能否登上你的破床|涛声是否依旧)回复于 2006-06-08 16:50:21 得分 0

将Sleep(10000)改为循环的方式,每个循环里面Sleep(100),加个变量,线程执行时变量为0,一旦线程结束,将变量改为1,延时循环里面遇到这个变量为1立即退出循环。  
   
  你现在的问题应该是在10000ms的Sleep过程中线程退出不了。中途打断Sleep过程就可以了。Top

33 楼fan_love(繁)回复于 2006-06-08 21:55:35 得分 0

你在线程的   Execute()   函数里   WaitFor();  
  整个线程就被挂起来了~~~线程死锁了~~~Top

34 楼13661023811(苯苯)回复于 2006-06-08 22:48:17 得分 0

和Sleep无关,是WaitFor()搞鬼,如果线程是堵塞的,我一般用一个标示来指明线程是否结束,Terminate()并不是真正的关闭,它也是设置了一个标志而已,不要轻易怀疑公版的控件,首先应该是自己的程序。Top

35 楼VirtualDesktop(^_^)回复于 2006-06-09 01:38:49 得分 0

你在线程的   Execute()   函数里   WaitFor();  
  整个线程就被挂起来了  
  Terminate只是设个标记,让系统知道线程执行完就释放而已Top

36 楼bxjgood66(累并快乐着!真想...^-^)回复于 2006-10-11 23:41:47 得分 0

markTop

37 楼wood542344(人生就是比当归大条)回复于 2006-10-12 11:57:20 得分 0

学习中。。。Top

38 楼wt_sanlian(雷电)回复于 2006-10-13 08:26:01 得分 0

Terminate与WaitFor应当在外部被调用,而不是线程的Execute里调用.  
   
  如果你创建一个线程,FreeOnTerminate设为false  
  那么在你主线程中的结束线程的语句应当为  
   
  myThread   ->   Terminate()         //   设置myThread中的Terminated标记  
  myThread   ->   WaitFor();           //   等待myThread中Execute方法完全退出  
  delete   myThread;                       //   删除myThread对象  
   
  而FreeOnTerminate   如果为true的话  
  直接用  
  myThread   ->   Terminate()就行了  
  也不需要delete线程对象,因为线程一结束完就自动退出了!Top

39 楼bxjgood66(累并快乐着!真想...^-^)回复于 2006-11-08 08:46:17 得分 0

markTop

40 楼pizzame(芯火)回复于 2006-12-08 15:06:26 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:talkingmute

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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