线程的简单问题7:线程的释放 ( 积分: 50 )

  • 主题发起人 主题发起人 ppqingyu
  • 开始时间 开始时间
P

ppqingyu

Unregistered / Unconfirmed
GUEST, unregistred user!
在数据库线程中,好多的例子都有这个释放
destructor QueryThread.Destroy;
begin
FAdoQuery.FREE;
FAdoQUserInfor.FREE;
Fadoconnection.Free;
strlist.Free;
iplist.free;
CoUnInitialize;//必须使用
inherited destroy;
end;
这段代码是何时才会调用的?我在那些例子当中找不到有安插这个方法的代码,是不是自动执行的?
procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
这段代码执行完了之后会释放线程了吗?因为我有一个疑问,这是一个数据库查询,FQuery在OPEN之后,要想保持显示所得出的数据,连接就不能段开,如果线程释放,FQuery不是也释放,连接就不是断开了吗?如果没有释放,如果查询的条件改变,再调用线程不是冲突了?
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
end;
而且那个源码当中,还有这一样段,线程如果是执行完释放的话,这段话就没有用了吧?
 
在数据库线程中,好多的例子都有这个释放
destructor QueryThread.Destroy;
begin
FAdoQuery.FREE;
FAdoQUserInfor.FREE;
Fadoconnection.Free;
strlist.Free;
iplist.free;
CoUnInitialize;//必须使用
inherited destroy;
end;
这段代码是何时才会调用的?我在那些例子当中找不到有安插这个方法的代码,是不是自动执行的?
procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
这段代码执行完了之后会释放线程了吗?因为我有一个疑问,这是一个数据库查询,FQuery在OPEN之后,要想保持显示所得出的数据,连接就不能段开,如果线程释放,FQuery不是也释放,连接就不是断开了吗?如果没有释放,如果查询的条件改变,再调用线程不是冲突了?
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
end;
而且那个源码当中,还有这一样段,线程如果是执行完释放的话,这段话就没有用了吧?
 
其实只要设置
Onterminate:=某方法,这样在线程结束前自然会被调用,比如
procedure TSendShortMessageThread.Execute;
var
bitmap:tbitamp;
begin
bimap:=tbitmap.create(nil)
onterminate:=Threaddone;
end;

procedure Threaddone(sender: tobject);
begin
bimap.free;
//在Destory之前会被调用
end;
 
你的代码不全,不好判断。
如果有QueryThread.Terminate;
则线程会结束,结束时先执行Onterminate事件
的内容,然后执行Destroy中的内容。
 
destroy在线程终止时自动执行
FreeOnterminated=true
 
procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
这段代码执行完了之后会释放线程了吗?因为我有一个疑问,这是一个数据库查询,FQuery在OPEN之后,要想保持显示所得出的数据,连接就不能段开,如果线程释放,FQuery不是也释放,连接就不是断开了吗?如果没有释放,如果查询的条件改变,再调用线程不是冲突了?
 
destructor QueryThread.Destroy;
begin
FAdoQuery.FREE;
FAdoQUserInfor.FREE;
Fadoconnection.Free;
strlist.Free;
iplist.free;
CoUnInitialize;//必须使用
inherited destroy;
end;

在线程释放时调用,线程释放有两种方式,一种是主动,一种是被动.
FreeOnterminated = True时线程执行完也会自动释放自己
 
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
这些代码根本没有意义,如果主程序都被杀死了,其它线程也会跟着被杀死的
 
呵呵...不明白,我想知道的是,如果没有其他的代码,只有这一段代码,这个线程完成最后一个END之后,会自动释放了吗?我所担心的是,在程序运行期间,需要再次执行线程查询,但这个线程没有释放会否引起冲突?因为查询的条件随时会变的呀.
procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
 
在主线程建立一个内存表,在线程中,把查询结果放到内存表中就可以了。要注意资源同步的问题哦。[:D]
 
可能我对数据库的理解有点问题,任何一个表,要显示数据,都要通过DataSource连接到Query再连接到库吧?在线程中FQuery是动态创建并连接的,如果线程释放,那FQuery就释放了,连接就断开了,数据怎么能显示?如果显示数据,连接就要还在呀?那线程会释放了吗?
 
是否释放,要看你Synchronize(ConnectDataSource);中的ConnectDataSource过程
是否有释放的动作,有则释放,无则不会释放。
 
那就是没有释放了.那事件只有一行代码FDataSource.DataSet := FQuery;用于DataSource的赋值.
那这样的话,再次执行线程查询,是否要先释放前一次的线程?
 
多人接受答案了。
 
后退
顶部