首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

FreeOnTerminate不能开释线程

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

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和指针指向的对象有没有释放,无关。

热点排行