线程应用程序中Indy的错误!

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)

谢谢 :)

jpf*_*ius 8

你应该打电话

aThread.WaitFor;
Run Code Online (Sandbox Code Playgroud)

在销毁线程之前.这可以确保线程正确终止.在不终止线程的情况下销毁线程可能会导致执行方法中的访问冲突,从而导致FastMM显示内存泄漏.

编辑考虑到问题可能是执行方法中的阻塞调用这一事实,您可能希望将TIdHttp.ReadTimeOut设置为合理的时间并定期检查线程终止.