문제

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을 합리적인 시간으로 설정하고 정기적으로 스레드 종료를 확인할 수 있습니다.

다른 팁

Indy는 또한 정수 및 임계 섹션과 같이 2 ~ 3 개의 예상 메모리 누출을 생성합니다. 그러나 그들은 예상대로 등록되었을 수도 있고 없을 수도 있습니다. 그래서 나는 이것들이 당신이 보는 것인지 알 수 없습니다. 코드를 5 번 실행한다면 지금보고있는 것보다 더 많은 누출이 보이겠습니까?

Smasher가 제안한 대기자는 무료로 전화하기 전에 전화하십시오. TTHREAD의 소멸자를 확인하면 이미 수행 된 것이 정확히 표시되기 때문에 문제가 필요하지 않아야합니다.

누출 보고서에서 액세스 위반을받는 이유는 모르겠습니다. 그러나 Indy 구성 요소가 스레드에서 사용되는 동안 스레드 외부에서 연결을 끊는 것을 호출합니다. 다른 스레드에서 동일한 비 스레드 안전 구성 요소를 사용하면 문제가 발생합니다. 이로 인해 액세스 위반이 유출 될 수 있습니다. 스레드 자체가 인디 구성 요소에 대한 모든 호출을 수행하도록하십시오.

Smasher가 제안한대로 읽기 시간을 줄이는 것은 응용 프로그램이 너무 오래 차단되지 않도록하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top