TPingSend synapse – wyciek pamięci!

TPingSend synapse – wyciek pamięci!
Gimo
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 4 lata
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.

Kopiuj
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
edytowany 4x, ostatnio: flowCRANE
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
2
  1. używanie try - finally ma wyglądać tak
Kopiuj
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

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Gimo
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 4 lata
0

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

Kopiuj
ping:=TPing1.Create(false);
edytowany 2x, ostatnio: flowCRANE
flowCRANE
Wstawiaj kod w znaczniki kolorujące składnię – ```pascal przed kodem, a po kodzie samo ```
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

CAŁY KOD WĄTKU


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Gimo
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 4 lata
0

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

Wywołanie:

Kopiuj
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:

Kopiuj
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.
edytowany 1x, ostatnio: Gimo

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.