6

正如我在这里问的那样,我有多线程应用程序。我想终止线程,并在调用以下方法时启动一个新线程。

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,我得到内存泄漏。如何释放线程?

4

3 回答 3

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;
于 2012-09-25T17:52:21.890 回答
8

除了RRUZ 的回答之外,让它与FreeOnTerminate = False

Terminate只是设置标志,它什么都不做。

改变

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

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

Free将调用TerminateWaitFor随后消除您的内存泄漏。

于 2012-09-25T06:24:15.683 回答
6
  1. 避免需要启动一个挂起的线程
  2. 修改您的TThread构造函数以接收 OwnerForm 参数
  3. 在线程的构造函数中设置 FreeOnTerminate 值。
  4. 以非挂起状态启动 TThread。

像这样。

  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
于 2012-09-25T06:11:22.777 回答