您的位置:程序门 -> delphi -> vcl组件开发及应用



多线程停止的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


多线程停止的问题
发表于:2007-08-23 17:37:10 楼主
我在程序里面   启动一个线程,   这个线程是对一个表由头到尾地处理数据。   但是我想停止这个线程,好像停止不了的?反而暂停和继续就行。请问是什么问题?   谢谢!
发表于:2007-08-23 17:40:031楼 得分:0
线程.terminat;
发表于:2007-08-23 17:45:432楼 得分:0
楼上的兄弟   ,我也是用这个的   ,但是停止不了。
发表于:2007-08-23 20:34:503楼 得分:0
线程的EXECute方法中加   terminated   判断,terminated   =   true   就跳出
发表于:2007-08-23 22:18:294楼 得分:0
楼上的兄弟   可以告知具体的方法吗?   谢谢
发表于:2007-08-24 09:12:445楼 得分:0
terminate只是把线程的terminated属性设置为true而已,如果你的EXECute里的某个方法正在执行的话,线程是不会停止的(直到你的方法执行完,线程判断到terminated属性位置)。

作为要随时停止的线程,一个好的习惯是把大的操作分小,这样才可以方便随时判断到terminated属性是否为true。

如果操作实在不可细分,还有一种歪门点的办法就是,利用异常来停止当前执行的方法,然后捕捉异常后退出线程。

最终方法是用api的terminatethread,不过一般不建议使用,所有后果自己负责(如资源释放等)
发表于:2007-08-26 09:49:576楼 得分:0
楼上兄弟,我已经按照你的方法

但是,mythread.terminate   后,   线程还保存在内存里面的?
我需要把他   mythread.free   和   mythread.destroy   吗?我执行了以上操作了,但是关闭窗体报错。
不知道是否由于线程没有处理好。

还有,我用了线程,执行完线程的操作后   会报:   error   creating   window   device   context   ,这个错不是每次都报,请问由是什么原因?
发表于:2007-08-26 14:02:457楼 得分:0
在我的项目里面我是把整个线程类给释放掉了就没有那问题,好像是   .free   还是   :=nil   记不太清楚了
发表于:2007-08-26 22:09:488楼 得分:0
但是,mythread.terminate       后,       线程还保存在内存里面的?  
我需要把他       mythread.free       和       mythread.destroy       吗?
----------------------------------------------------------
对,线程还没释放,你需要在外面把它释放掉;或者把其freeonterminate属性设置成true也可以。
发表于:2007-08-27 09:04:319楼 得分:0
楼上的兄弟?


不都是楼主(kciv   )一个人吗?  
发表于:2007-08-27 09:12:4710楼 得分:0
晕   ,csdn怎么搞的,开始显示的全是楼主的帖!!   :(
发表于:2007-08-29 09:21:4211楼 得分:0
但是,mythread.terminate       后,       线程还保存在内存里面的?    
我需要把他       mythread.free       和       mythread.destroy       吗?  
----------------------------------------------------------  
对,线程还没释放,你需要在外面把它释放掉;或者其freeonterminate属性设置成true也可以。


问题是,有些情况是不能等到线程完成我就想把它关闭啊,如果其freeonterminate属性设置成true,是要等到线程结束才释放的吧?
发表于:2007-08-29 09:31:1012楼 得分:0
对了   ,如果没有等线程完成,就关闭窗体,报这个错:

project   project2.exe   raised   exception   class   estackoverflow   with   message   'stack   overflow'.process   stopped.use   step   or   run   to   continue   .
发表于:2007-08-29 09:33:3913楼 得分:0
问题是,有些情况是不能等到线程完成我就想把它关闭啊,如果其freeonterminate属性设置成true,是要等到线程结束才释放的吧?
------------------------------------------
你把它terminate了,不就结束了?然后freeonterminate就有用了。当然你想随时停的话,EXECute里的循环必须要能做到随时检查terminated标记才行,或者使用其它方法以让程序能检测到此标记。
发表于:2007-08-29 09:37:1514楼 得分:0
如果没有等线程完成,就关闭窗体,报这个错
----------------
所以我现在比较习惯在窗体上进行线程释放,free之前先来个waitfor,保证窗体等待线程释放完后再释放。

不过overflow错误估计是由你的线程内部引起的(我不知道具体实现),一般出现循环调用,导致内存急剧增加,就有可能stack   overflow
发表于:2007-08-31 17:20:2115楼 得分:0
上面的问题还没有解决。
又有一个新问题了。

调用线程,运行了一下,报错:

project   projec2.exe   raised   exception   class   eaccessviolation   with   message   'access   violation   at   address   004e0f64   in   module'project2.exe'.read   of   address   00000028'.   process   stopped.use   step   or   run   to   continue.

在我的笔记本没有这个问题,我的笔记本是单核cpu   。在台式机是双核的,不知道跟这个有关系吗?我试了双cpu的也报这样的错。
发表于:2007-09-03 09:43:1316楼 得分:0
自己顶上去!
发表于:2007-09-04 11:16:5517楼 得分:0
再顶上去!
发表于:2007-09-05 16:02:4318楼 得分:0
前几天,我用socket编写多文件传输的时候,处理过类似的问题,
我在clientEXECute{相当于tthread的EXECute}里面终止线程。。。


参考代码:
        while   (not   terminated)   and   clientsocket.connected   do
        begin
            ......
            if   readtext   =   key_clt[4]   then
                terminate;
        end;


快速检索

最新资讯
热门点击