如何真正释放一个动态创建的线程??在线等!!
通过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




