TPingSend synapse – wyciek pamięci!

0

Prosta aplikacja sprawdzająca ping w timerze co 50ms. Problem polega na tym ze po kilkunastu dniach aplikacja potrafi zajmowac w pamieci nawet 600mb i ciagle rosnie (pinguje około 150 hostów co 20 sek)!
Wykonałem test > zamieniłem pingSend na Indny i nie ma tego problemu, ewidentnie wyciek jest po stronie pingsend. Czy komuś udało sie nad tym zapanować ?
// DODAM ze 20 hostów jest offline.

procedure Tping1.Execute;
var
pg:TPingSend;
wew_ping:integer;
begin
  FreeOnTerminate:=true;

  wew_ip:=u2_host;
  u2_stop:=true;

//->PingSend
try
pg:=TPingSend.Create;
pg.Timeout:=250;
if pg.Ping(wew_ip) = true then
 begin
   wew_ping:=pg.PingTime;
   wew_odpowiedz:='1:[ip:-'+
   wew_ip+'-]'+'[ms:'+
   IntToStr(wew_ping)+'-]';
 end else
  begin
   wew_odpowiedz:='0:[ip:-'+wew_ip+'-]';
  end;
 synchronize(u2_dodaj_odpowiedz);
finally
//Destruktor
if pg <> nil then
 FreeAndNil(pg);
//pg.Free;
end;
//<- PingSend

u2_stop:=false; //mozna wykonywać kolejny
2
  1. używanie try - finally ma wyglądać tak
obiekt := TKlasa.Create;
try
  obiekt.cos;
finally
  obiekt.Free;
  //lub
  FreeAndNil(obiekt);
end;
  1. zwalniasz wątek? - daj cały kod wątku
  2. w czym piszesz? w nowszych Delphi masz ReportMemoryLeaksOnShutdown w starszych można to samo osiągnąć korzystając z FastMM
0

d 2007 wersja komercyjna, kupilem dawno temu - brak ReportMemoryLeaksOnShutdown :)

ping:=TPing1.Create(false);
0

CAŁY KOD WĄTKU

0

Problemem jest sam TPingSend, nie zwalania się poprawnie i zapycha pamięć.

Wywołanie:

if (unit1.u1_lista_ip.Count > 0) and (unit2.u2_stop = false) then
 begin
  s_ip:=unit1.u1_lista_ip[0];
  unit1.u1_lista_ip.Delete(0);
  unit2.u2_host:=s_ip;
  g_ip1:=TPing1.Create(false);
  sleep(5);
  //g_ip1.Free;
 end;

Wątek:

unit Unit2;

interface

uses
  Classes,unit1,SysUtils,ComCtrls, pingsend;

type
  Tping1 = class(TThread)
  private
    { Private declarations }
    wew_odpowiedz,wew_ip:string;
    procedure u2_dodaj_odpowiedz;
  protected
    procedure Execute; override;
  end;

var
u2_host:string;
u2_stop:boolean;
  
implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure Tping1.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ Tping1 }


procedure tping1.u2_dodaj_odpowiedz;
begin
  unit1.u1_lista_odpowiedz.Add(wew_odpowiedz);
end;

procedure Tping1.Execute;
var
pg:TPingSend;
wew_ping:integer;
begin
  FreeOnTerminate:=true;

  wew_ip:=u2_host;
  u2_stop:=true;

//->PingSend
try
pg:=TPingSend.Create;
pg.Timeout:=250;
if pg.Ping(wew_ip) = true then
 begin
   wew_ping:=pg.PingTime;
   wew_odpowiedz:='1:[ip:-'+
   wew_ip+'-]'+'[ms:'+
   IntToStr(wew_ping)+'-]';
 end else
  begin
   wew_odpowiedz:='0:[ip:-'+wew_ip+'-]';
  end;
 synchronize(u2_dodaj_odpowiedz);
finally
//Destruktor
if pg <> nil then
 FreeAndNil(pg);
//pg.Free;
end;
//<- PingSend
u2_stop:=false; //mozna wykonywac kolejny

end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1