还是线程释放的问题。。。(100分)

  • 主题发起人 主题发起人 ludao
  • 开始时间 开始时间
L

ludao

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序里创建了多个线程实例,create中指定了freeonterminate:=True;在execute
里我要执行一些数据库操作(一些sql语句)。正常情况下也都没有问题,但有时候,
一个线程出现了异常(大概是执行数据库操作时异常了),结果这个线程就“死”在那里
了,不释放!
我用了Mythread.terminate;destroy;free等方法都没用。怎样安全释放掉死掉的线程呢?
 
试过在Execute中加入try...finally吗?
 
加了,但是也不产生异常错误,应该是想数据库提交语句的时候出现了未知的错误。
我的execute代码这样写的:
if terminated then
Exit;
try
.....
一些数据库操作.....
except
do
handleException;
end;
但有时候线程会死在“数据库操作”那里,异常捕捉不到,不知道如何才能把它彻底释放掉?
 
对VCL的操作要用Synchronize调用才能保证安全
 
对,操作尽量写成函数用Synchronize调用
 
数据库操作那里我的确用了一个dataset控件,是从外部传进去的.但是,我是一个线程对应
一个dataset,不存在访问冲突.如果数据库操作也同步的话,那我的多线程就没有意义了!
现在的问题是,如果数据库操作那里"死掉"的话,如何将线程彻底释放...
谢谢!
 
if not QueryThread[nId].Terminated then
begin
QueryThread[nId].Terminate;
{ 销毁之前终止线程执行 }
QueryThread[nId].Free;
QueryThread[nId]:=nil;

end;
 
[red]我是一个线程对应一个dataset[/red]
但你这些dataset对象的Session(BDE)或者是ADOConnection(ADO)
是同一个吗?
如果是同一个,还是存在冲突问题.
 
异常捕捉不到:用raise试试。
另外最好将try...except...写到一个try...finally,这样
当产生一个异常时用raise就能将异常提到finally模块中,
然后在finally模块中正常退出线程。
关系VCL的操作使用Synchronize。
对于错误信息最好用返回值,在线程结束后处理。
 
xeen,连接控件也一一对应了(我用的是三方控件asta)。基本可以排除是访问冲突
的问题,数据库操作那里提交sql语句后应该不等待数据库成功返回信息吧?比如,我
发出一条insert语句。奇怪的是,有时候数据库操作都成功了(根据监控信息查询数据库
内容),execute区的代码都执行完了,但并不去执行destroy过程。。。死在那里了!
 
应该没有执行完,也许有些数据库的错误不引起异常.
 
ok,大概就这样了,散分!
 
后退
顶部