2003-10-31 09:30:07 猛禽
对线程的概念理解有问题
2003-10-31 09:30:18 majorsoft
free 调用destroy.
我在destroy中 fItemNo:=-1
2003-10-31 09:30:28 majorsoft
我觉得也是。
2003-10-31 09:30:39 猛禽
TThread.Destroy中会调用WaitFor
2003-10-31 09:30:47 猛禽
所以会等待
2003-10-31 09:30:49 majorsoft
对
2003-10-31 09:31:06 猛禽
只有Execute函数正常执行完,free才会正常退出
2003-10-31 09:31:18 majorsoft
waitfor是不是等待线程被调度执行?
2003-10-31 09:31:26 猛禽
其实整个线程类中,只有Execute是真正在线程中的部分
2003-10-31 09:31:32 猛禽
其它都是在主线程中
2003-10-31 09:31:34 majorsoft
对
2003-10-31 09:31:54 猛禽
DESTROY是主线程执行的,WaitFor就是等待EXECUTE退出
2003-10-31 09:32:00 猛禽
所以你的做法就是错误的
2003-10-31 09:32:11 猛禽
不要OVERRIDE DESTROY
2003-10-31 09:32:15 猛禽
改用Terminate
2003-10-31 09:32:37 猛禽
将While的条件中加入Not Terminated
2003-10-31 09:32:55 独心(小伍)
我只是觉得ThrLoopPly.destroy没有调用
原来这样
2003-10-31 09:32:55 猛禽
如果Terminated为true,则EXECUTE必须退出
2003-10-31 09:33:11 majorsoft
我试过了,好象不行。
我再试一次
2003-10-31 09:33:28 猛禽
你是怎么试的,肯定还有错误,把代码贴到DFW上
2003-10-31 09:34:33 majorsoft
等等
2003-10-31 09:35:15 流铭
不过,当 FreeOnTerminate 为 True 时,还是由线程自己 Free 线程对象的
2003-10-31 09:36:00 majorsoft
自己可以销毁自己吗?
2003-10-31 09:36:23 猛禽
那也是先terminate再free
2003-10-31 09:36:30 majorsoft
对。
2003-10-31 09:36:41 猛禽
可以
2003-10-31 09:36:46 猛禽
当然可以
2003-10-31 09:36:46 majorsoft
其实在destroy中有terminate
2003-10-31 09:37:02 独心(小伍)
while fItemNo<5 and not terminateddo
2003-10-31 09:37:13 majorsoft
只用free 就可以了。
2003-10-31 09:37:18 猛禽
对,如小伍这样
2003-10-31 09:37:25 猛禽
最好用FREEONTERMINATE
2003-10-31 09:37:43 流铭
不是“自己可以销毁自己”
线程 和 Thread 线程对象 是两码事
2003-10-31 09:37:50 猛禽
这样当你调用TERMINATE后,OBJECT会在EXECUTE执行完后调用FREE
2003-10-31 09:38:03 猛禽
流铭说的对
2003-10-31 09:38:11 猛禽
线程只是EXECUTE部分
2003-10-31 09:38:24 猛禽
而TTHREAD对象是主线程中的一个对象
2003-10-31 09:38:59 独心(小伍)
procedure ThrLoop.execute;
里加上freeonterminate:=ture
2003-10-31 09:39:06 majorsoft
你们试过可以吗?》?
2003-10-31 09:39:32 majorsoft
开始我都是按你们说的那样做的,但就是终止不了
2003-10-31 09:39:33 猛禽
FREEONTERMINATE最好在CREATE的时候设置
2003-10-31 09:39:48 猛禽
不可能,你把完整代码贴出来
2003-10-31 09:40:33 流铭
主线程和分线程都能够操纵 TTHREAD 对象
2003-10-31 09:41:33 majorsoft
我想贴但上不了DFW
2003-10-31 09:42:31 猛禽
所以操作TTHREAD对象时要注意同步互斥的问题
2003-10-31 09:42:43 独心(小伍)
发 到qq 上我帮你贴上
2003-10-31 09:44:36 猛禽
看我在DFW上的跟贴
2003-10-31 09:46:56 majorsoft
对,你那样确实可以退出,但要等sleep()执行完。有没有办法直接退出?
2003-10-31 09:47:32 独心(小伍)
那要api 了
2003-10-31 09:47:36 猛禽
那你就要在SLEEP前判断Terminate
2003-10-31 09:47:51 猛禽
不要用API,如果要用API,就不要用TTHREAD类
2003-10-31 09:48:17 猛禽
二者有冲突,可能导致MEM LEAK或CRASH
2003-10-31 09:48:28 独心(小伍)
是不是很容易抛出异常?
2003-10-31 09:49:01 majorsoft
24287564(猛禽) 09:47:36
那你就要在SLEEP前判断Terminate
那样没有用,
2003-10-31 09:56:15 猛禽
你去看我在DFW上贴的代码
2003-10-31 09:56:30 猛禽
SLEEP不要放在线程里,放到PLAYITEM里去
2003-10-31 09:57:51 majorsoft
那么主线程不sleep了?
2003-10-31 09:59:55 majorsoft
问题就在sleep上面。
waitfor 要等execute执行完,但execute在执行sleep(2000)
2003-10-31 10:01:21 majorsoft
我用的方法和你们推荐的方法都可以终止线程,但是要等sleep执行完。
现在的问题是,我需要马上终止它
2003-10-31 10:01:21 majorsoft
我用的方法和你们推荐的方法都可以终止线程,但是要等sleep执行完。
现在的问题是,我需要马上终止它
2003-10-31 10:03:53 猛禽
你的马上是什么概念?
2003-10-31 10:04:18 猛禽
就是主线程想什么时候停它就能立即停下?
2003-10-31 10:05:58 猛禽
那还有两个办法:
一是不要用TTHREAD,用API
二是不要用SLEEP(因为假设PLAYITEM执行时间可以忽略,则大部分时间是用于SLEEP,那样的话,平均需要等等待SLEEP时间的一半),改用其它方法,如SUSPEND等
2003-10-31 10:07:49 majorsoft
24287564(猛禽) 10:04:18
就是主线程想什么时候停它就能立即停下?
对
2003-10-31 10:08:42 majorsoft
用suspend的话,怎么控制时间?
2003-10-31 10:09:24 猛禽
另外一个线程
2003-10-31 10:09:50 猛禽
但是如果PLAYITEM的执行时间较长的话,这种方法也不行,只能用API
2003-10-31 10:10:35 majorsoft
这个时间可以不计
2003-10-31 10:11:14 猛禽
那可以用那种方法
2003-10-31 10:11:38 猛禽
PLAYITEM后启动一个计时线程
2003-10-31 10:11:48 猛禽
然后把自己SUSPEND
2003-10-31 10:11:59 猛禽
计时到把它RESUME
2003-10-31 10:12:22 猛禽
主线程要停时把两个线程都TERMINATE即可
2003-10-31 10:14:06 majorsoft
那么终止计时线程还是要等待啊
2003-10-31 10:15:37 majorsoft
用API函数的话,可以,但知道不安全。到底怎么做比较安全呀?
2003-10-31 10:15:54 猛禽
计时线程不能用SLEEP
2003-10-31 10:16:15 猛禽
API也可以安全,但用API就不能用TTHREAD类,会比较麻烦
2003-10-31 10:18:59 majorsoft
24287564(猛禽) 10:15:54
计时线程不能用SLEEP 那用什么计时?
2003-10-31 10:19:17 majorsoft
不太好用API那个。
2003-10-31 10:22:34 猛禽
循环GetTickcount
2003-10-31 10:22:41 猛禽
或用Timer
2003-10-31 10:23:41 majorsoft
怎么在线程中用timer控制?
2003-10-31 10:24:15 猛禽
建立消息循环,用API创建TIMER
2003-10-31 10:25:34 majorsoft
有点头晕,
2003-10-31 10:35:37 majorsoft
你能帮我写一下吗?
2003-10-31 10:43:36 猛禽
倒,没空
2003-10-31 10:46:40 majorsoft
:(
那算了,
现在我用API倒可以终止。
但我连续创建线程,然后用API终止它,内存会增加,
2003-10-31 10:47:12 majorsoft
速度是以k为单位的。
2003-10-31 10:47:42 猛禽
因为用API终于不会FREE TTHREAD类,所以出现MEM LEAK
2003-10-31 10:47:45 majorsoft
但我想那个线程对象比较小,不会是它消耗的内存呀。
2003-10-31 10:48:04 猛禽
而如果手工FREE则会因为THREAD已经被API终止而出现EXCEPTION
2003-10-31 10:48:30 majorsoft
》》而如果手工FREE则会因为THREAD已经被API终止而出现EXCEPTION
对
2003-10-31 10:48:44 majorsoft
但我觉得那线程对象比较小啊。
2003-10-31 10:49:10 majorsoft
只有几个数据成员,也不至于造成这么大的泄露呀。
2003-10-31 10:49:33 猛禽
呵呵,你创建的部分是不大,DELPHI建了些什么就不知道了
2003-10-31 10:50:09 majorsoft
有没有办法在线程终止了,然后再释放内存的?
2003-10-31 10:50:21 majorsoft
我用freeMem怎么样?
2003-10-31 10:54:19 猛禽
也不行,如果用API,最好的办法就是不要用TTHREAD或自己写一个TTHREAD
2003-10-31 10:57:57 majorsoft
哎!