Niy*_*wan 5 delphi multithreading
我问这里有多线程应用程序.我想终止线程,并在调用以下方法时启动一个新线程.
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
Run Code Online (Sandbox Code Playgroud)
但是,当FreeOnTerminate设置为True,我得到访问冲突,但FreeOnTerminate设置为时False,我得到内存泄漏.如何释放线程?
Rem*_*eau 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;
Run Code Online (Sandbox Code Playgroud)
除了RRUZ的答案之外,还要让它与之合作FreeOnTerminate = False:
Terminate 只是设置标志,它什么都没做.
更改
if Assigned(updaterThread) and (updaterThread <> nil) then
begin
updaterThread.Terminate;
end;
Run Code Online (Sandbox Code Playgroud)
至
if Assigned(updaterThread) then
begin
updaterThread.Free;
end;
Run Code Online (Sandbox Code Playgroud)
Free将调用Terminate并WaitFor随后消除您的内存泄漏.
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;
Run Code Online (Sandbox Code Playgroud)
现在你可以用这种方式创建你的Tthread
GridUpdater:=TGridUpdater.Create(Self); //Just set it and forget it
Run Code Online (Sandbox Code Playgroud)