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

标签 delphi multithreading indy

当 TidHTTP 在 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;
<小时/>

当应用程序关闭时,我用这个停止线程:

aThread.Disconnect;
aThread.Terminate;
aThread.Free;

我应该如何解决内存泄漏问题?

FastMM4 Log :

13 - 20 bytes: TIdThreadSafeInteger x 1
21 - 36 bytes: EAccessViolation x 1, TIdCriticalSection x 2
181 - 212 bytes: UnicodeString x 1

谢谢:)

最佳答案

你应该打电话

aThread.WaitFor;

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

编辑考虑到问题可能是执行方法中的阻塞调用,您可能需要将 TIdHttp.ReadTimeOut 设置为合理的时间并定期检查线程终止情况。

关于delphi - 线程应用程序中的 Indy 错误!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518975/

相关文章:

delphi - 如何将 nil 传递给 var 参数?

multithreading - delphi中如何释放线程

c++ - 在互斥范围之外调用 std::list/vector/map/deque::empty() 会导致什么问题?

multithreading - 如何更改监听器线程优先级

delphi - Delphi XE 中使用 Indy IdHttp Digest 身份验证的 401

database - 如何使用ADT表重试Delphi TAdsConnection

delphi - FreePascal 版 Indy 稳定吗?

multithreading - 多个线程可以获取同一个锁吗?

delphi - 哪个 Indy TIdHTTPServer 代码负责服务器端检查 SSL 版本和密码?

delphi - 如何将组件放置在 TMainMenu 上方?