读书人

FreeOnTerminate不能开释线程

发布时间: 2013-10-14 12:54:46 作者: rapoo

FreeOnTerminate不能释放线程
delphi7 多线程学习--子线程释放
子线程一定要手工释放?不能自动释放?
下面是主 子线程代码


unit UThreadTest;

interface

uses
Classes,SysUtils,ADODB,ActiveX;

type
TMainthr = class(TThread) //主线程
private
{ Private declarations }
adocon : TADOConnection;
protected
procedure Execute; override;
public
name : String;
ss : TStrings;
isStop : Boolean;
Constructor Create;
destructor Destroy; override;
end;
TSubthr = class(TThread) //子线程
private
{ Private declarations }
adocon : TADOConnection;
protected
procedure Execute; override;
public
name : String;
ss : TStrings;
isStop : Boolean;
Constructor Create;
destructor Destroy; override;
end;
implementation
{ TMainthr }


Constructor TMainthr.Create;
begin
inherited create(true); //生成是阻赛的的
adocon := TADOConnection.Create(nil);
ss := TStringList.Create;
end;

destructor TMainthr.Destroy;
begin
inherited;
FreeAndNil(adocon) ;
FreeAndNil(ss);
CoUninitialize;
end;

procedure TMainthr.Execute;
var
aSubthr : TSubthr;
i : Integer;
begin

i:= 0;
while not Terminated do
begin
aSubthr := TSubthr.Create;
aSubthr.FreeOnTerminate := true;
aSubthr.name := 'Subthr';
aSubthr.Resume;


if Assigned(aSubthr) then
begin
aSubthr.name :='bbb';
ss.Add('Subthr还未释放');
end;

ss.Add(name + IntToStr(i));
if i>50000 then
begin
i:=0;
ss.Clear;
end;


i := i+ 1;
Sleep(500);
end;

end;


{ TSubthr }


Constructor TSubthr.Create;
begin
// inherited create(true); //生成是阻赛的的
inherited Create(true);
FreeOnTerminate := true;
CoInitialize(nil);
adocon := TADOConnection.Create(nil);
ss := TStringList.Create;
end;

destructor TSubthr.Destroy;
begin
inherited;
FreeAndNil(adocon) ;
FreeAndNil(ss);

end;

procedure TSubthr.Execute;
var
i : Integer;
begin

for i := 0 to 20 do
begin
Sleep(10);
end;

i :=0;



end;


end.

调用代码

var
aMainThr : TMainthr;
procedure TForm1.btn16Click(Sender: TObject);
begin

if not Assigned(aMainthr) then
begin

aMainthr := TMainthr.Create;
// ffa.FreeOnTerminate:=True;

// mmo1.Text := ffa.ss.Text;
// ffa.ss:=mmo1.Lines;
// ffb.aWriteLog := wrtieLog;
aMainthr.name := 'MainThr';
aMainthr.Resume;

end;
end;

[解决办法]
if Assigned(aSubthr) then

你确定这句能判断它释放了没?
[解决办法]
是不是你的线程没有执行完哦! 所以就没有释放
[解决办法]
FreeOnTerminate是线程被Terminate后自动调用Destory这个事件。即aMainthr.Terminate
------解决方案--------------------


设置了 FreeOnTerminate,当调用 Terminate 去结束线程后,线程会自己终结的,不用你去销毁
[解决办法]
FreeOnTerminate不能开释线程
子线程的线程函数,明显写的有问题,要判定一个对象是否释放,也不是直接一个Assign可以判定他是否释放的!
Assign只是判定指针是否为nil罢了,这样,就算释放了,但是变量只想的地址空间不为nil,也会为true。子线程中判定线程结束,可以用线程的WaitFor或者使用WaitForSingleObject等
[解决办法]
判断个指针释放nil和指针指向的对象有没有释放,无关。

读书人网 >.NET

热点推荐