Ari*_*l32 1 delphi multithreading indy
当它在GET之后等待服务器的响应并且线程被终止时,我有一些与TidHTTP相关的内存泄漏.
示例:
aThread = class(TThread)
private
FidHTTP :TidHTTP;
FCommand :String;
public
procedure Execute(); override;
constructor Create(aCommand :String); override;
procedure Disconnect;
end;
procedure aThread.Execute();
var response :String;
begin
response := FidHTTP.Get(FCommand);
end;
procedure aThread.Disconnect;
begin
if ((FidHTTP <> nil) and (FidHTTP.Connected)) then FidHTTP.IOHandler.CloseGracefully;
end;
constructor aThread.Create(aCommand :String); override;
begin
FCommand := aCommand;
inherited Create;
end;
Run Code Online (Sandbox Code Playgroud)
当应用程序关闭时,我用这个停止线程:
aThread.Disconnect;
aThread.Terminate;
aThread.Free;
Run Code Online (Sandbox Code Playgroud)
我该怎么办才能解决内存泄漏问题?
FastMM4 Log :
13 - 20 bytes: TIdThreadSafeInteger x 1
21 - 36 bytes: EAccessViolation x 1, TIdCriticalSection x 2
181 - 212 bytes: UnicodeString x 1
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
你应该打电话
aThread.WaitFor;
Run Code Online (Sandbox Code Playgroud)
在销毁线程之前.这可以确保线程正确终止.在不终止线程的情况下销毁线程可能会导致执行方法中的访问冲突,从而导致FastMM显示内存泄漏.
编辑考虑到问题可能是执行方法中的阻塞调用这一事实,您可能希望将TIdHttp.ReadTimeOut设置为合理的时间并定期检查线程终止.