如何在delphi中释放一个线程

时间:2012-09-25 06:02:48

标签: multithreading delphi

我问here我有多线程应用程序。 我想终止线程,并在调用以下方法时启动一个新线程。

procedure TFRABData.RefreshDataset;
var
  GridUpdater: TGridUpdater;
begin
  if Assigned(updaterThread) and (updaterThread <> nil) then
  begin
    updaterThread.Terminate;
  end;
  GridUpdater := TGridUpdater.Create(True);
  GridUpdater.OwnerForm := Self;
  updaterThread := GridUpdater;
  GridUpdater.FreeOnTerminate := False;
  GridUpdater.Start;
  CodeSite.Send('RefreshDataset executed');
end

但是,当FreeOnTerminate设置为True时,我会收到访问冲突,但当FreeOnTerminate设置为False时,我会收到内存泄漏。如何释放线程?

3 个答案:

答案 0 :(得分:10)

您需要同时致电Terminate()WaitFor()Free(),例如:

procedure TFRABData.RefreshDataset; 
var 
  GridUpdater: TGridUpdater; 
begin 
  if Assigned(updaterThread) then 
  begin 
    updaterThread.Terminate; 
    updaterThread.WaitFor; 
    FreeAndNil(updaterThread); 
  end; 
  GridUpdater := TGridUpdater.Create(True); 
  GridUpdater.OwnerForm := Self; 
  GridUpdater.Start; 
  updaterThread := GridUpdater; 
  CodeSite.Send('RefreshDataset executed'); 
end;

答案 1 :(得分:7)

除了RRUZ's answer之外,还可以使用FreeOnTerminate = False

Terminate只设置标志,它什么也没做。

更改

  if Assigned(updaterThread) and (updaterThread <> nil) then 
  begin 
    updaterThread.Terminate; 
  end; 

  if Assigned(updaterThread) then 
  begin 
    updaterThread.Free; 
  end; 

Free会随后致电TerminateWaitFor以消除您的内存泄漏。

答案 2 :(得分:5)

  1. 避免启动暂停线程
  2. 修改您的TThread构造函数以接收OwnerForm参数
  3. 在线程的构造函数中设置FreeOnTerminate值。
  4. 在未暂停状态下启动TThread。
  5. 类似的东西。

      TGridUpdater = class(TThread)
      private
        FOwnerForm: TForm;
      public
        constructor Create(OwnerForm : TForm); overload;
        destructor Destroy; override;
        procedure Execute; override;
      end;
    
    constructor TGridUpdater.Create(OwnerForm: TForm);
    begin
      inherited Create(False);
      FreeOnTerminate := True;
      FOwnerForm:=OwnerForm;
    end;
    
    destructor TGridUpdater.Destroy;
    begin
    
      inherited;
    end;
    
    procedure TGridUpdater.Execute;
    begin
      //your code goes here
    
    end;
    

    现在你可以用这种方式创建你的Tthread

    GridUpdater:=TGridUpdater.Create(Self); //Just set it and forget it