我问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
时,我会收到内存泄漏。如何释放线程?
答案 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
会随后致电Terminate
和WaitFor
以消除您的内存泄漏。
答案 2 :(得分:5)
TThread
构造函数以接收OwnerForm参数类似的东西。
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