delphi 线程中超时如何安全退出线程(50)

  • 主题发起人 主题发起人 jadic
  • 开始时间 开始时间
J

jadic

Unregistered / Unconfirmed
GUEST, unregistred user!
比如下面的代码 procedure TMyThread.Execute;var num: Integer;
begin
while not Terminateddo
begin
while Truedo
begin
num := Random(1000);
Form1.edt1.Text := IntToStr(num);
end;
end;
end;
请问如何退出这种线程? 程序中有过这样的情况,向数据库中添加一条记录(是通过业务服务器实现的), 但在测试的时候出现过执行到这句的时候就停住了,没有报错,根据日志查看也生成了 正确的sql语句,但就是不跳到下一句继续执行,整个就死了 我现在想把数据库操作放到一个线程中去,如果超时了就退出改线程,就像上面的死循环一样如何退出呢?看到有用TerminateThread终止线程,但说会造成内存泄露,请教各位有什么安全的退出的方法 还有就是像这个操作非常频繁可以说每秒就操作多次,不知道这样以线程处理是否合理
 
1:线程结束的最佳办法,就是尽快结束Execute2:线程代码中不要直接操作界面3:你的while true 循环中没有写什么时候Terminated ,当然结束不了4:说到写数据库,还要用com ,你是否注意了
 
我是指如果执行了某一句代码(通过业务服务器接口往数据库里插入一条数据)不知什么原因就死在那了,不会再执行下一句,当然就不会去判断Terminated 了,所以就相当于一个while true的死循环换,我想在这种情况下,如果超过一定时间(比如10秒)我就将这个线程结束,结束对业务服务器接口的调用
 
while not Terminateddo
此种方式的线程,要停止它的操作,应该在外部调用线程对象的Terminate()方法另外,线程执行中,必须进行异常保护,象现在这样,如想直接在Execute方法中执行有可能抛出异常的函数或过程时而没有保护的话,程序其实是失控了,线程不知道跑到哪里去了,所以没办法停止。正确应该是:while not Self.Terminateddo
try ... 这里执行可能抛出异常的业务代码 //更新窗体界面有关的代码,必须用Synchronize方法与主线程串行化except on E: Exceptiondo
begin
//这里处理异常,决定是继续循环线程 //还是执行exit退出线程循环 end;
end;
 
调用terminate方法只是将terminated置为TRUE,并没有真的去结束线程我那去代码执行后并不是异常,只是迟迟没有返回,相当于超时了,我想把线程给结束了,但是没有返回就当然不会去判断terminated了,我想知道在外部有什么安全的结束线程的方法
 
老兄,用线程原则就是要确保线程能安全,可控地执行,不能往线程外抛出异常.换而言之,就是必须局限在Execute()方法中死循环。在死循环中判断Terminated然后退出就行了。如果在线程中发生异常(这个靠delphi调试器的单步执行估计不一定抓得到),当然就没有结果了--就是你说的没有返回。如果是一些耗时操作,比如大事务sql, 最好的做法是等这个sql调用返回,不可能不返回的。在外部中止线程不是说不行,有api可以做到,但起码得符合“线程中没有不可控异常”这个原则,而且是强烈不建议这样做。如果先是一个线程异常蔓延到Execute方法以外,然后再在主线程中执行api强行中止此线程,结果就是程序越来越不稳定。今天rp爆发,说了这么多,其实就是一个原则“让线程自己走向灭亡,而不是被异常或外部杀死”...就不知道你能不能理解了~~~
 
是的,我现在只能在超时的情况下,断开业务服务器,让它返回,从而让线程结束了[:(]
 
后退
顶部