Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Stilgar - Aprile 15, 2012, 10:51:59 pm

Titolo: Memory Leak
Inserito da: Stilgar - Aprile 15, 2012, 10:51:59 pm
Ciao a tutti di nuovo.
Allego una piccola form.
Non è un profiler ma aiuta a vedere l'andamento dell'uso della memoria. O almeno ne da un'idea.
Questo è il primo vero esperimento che ho eseguito con la grafica e le LCL ... (non mi entusiasma per nulla).
L'idea nasce come "clone" di una feature di apache batick (SVG in Java per intenderci). Quindi la paternità non spetta a me, ma a quelli di apache.
Se avete idee su come migliorare la cosa, vi prego postatele sul forum.
Titolo: Re:Memory Leak
Inserito da: nomorelogic - Aprile 16, 2012, 09:37:13 am
pensi si potrebbe fare una versione anche per linux?
Titolo: Re:Memory Leak
Inserito da: Stilgar - Aprile 16, 2012, 09:58:40 am
... urca ...
A case e in uffico ho una plettora di PC.
Vado da W2k a Win7. (Se mi metto di impegno, scommetto che un Win98 lo trovo ;) )
Ma non ho un Linux a portata di mano.
Eventualmente è da vedere come impostare il callback che imposto per Windows tramite i timer del SO.
Credo basti gestire la cosa come fa il TTimer (System nella paletta Lazarus) che viene caricata con l'installazione base.

(Ravanando sul codice , ho trovato le righe di codice da indagare ...
Codice: [Seleziona]
procedure TCustomTimer.UpdateTimer;
begin
  KillTimer;
  if (FEnabled) and (FInterval > 0)
  and (([csDesigning,csLoading,csDestroying]*ComponentState=[]))
  and Assigned (FOnTimer) then begin
    //DebugLn(['TCustomTimer.UpdateTimer ',dbgsName(Self),' WidgetSet.CreateTimer']);
    FTimerHandle := WidgetSet.CreateTimer(FInterval, @Timer);
    if FTimerHandle=0 then begin
      FTimerHandle:=cIdNoTimer;
      raise EOutOfResources.Create(SNoTimers);
    end;
    if Assigned(OnStartTimer) then OnStartTimer(Self);
  end;
end; 

procedure TCustomTimer.KillTimer;
begin
  if FTimerHandle <> cIdNoTimer then begin
    //DebugLn(['TCustomTimer.KillTimer ',dbgsName(Self)]);
    WidgetSet.DestroyTimer(FTimerHandle);
    FTimerHandle := cIdNoTimer;
    if Assigned(OnStopTimer) then OnStopTimer(Self);
  end;
end;
)
Codice: [Seleziona]

   FTimerHandle := WidgetSet.CreateTimer(FInterval, @Timer);  <-------->  FTimerHandle := SetTimer(self.Handle, 0, 500, nil);
   WidgetSet.DestroyTimer(FTimerHandle);  <------> KillTimer(self.handle, FTimerHandle);


Sono nell'impossibilità di verificare (carenza ferramenta sotto mano) se basta adattare il codice con questi cambiamenti.
Se fai la prova, poi posta il costruttore e il distruttore della classe ;)

 

Titolo: Re:Memory Leak
Inserito da: nomorelogic - Aprile 16, 2012, 10:50:11 am
vedrò di fare la prova in giornata o al max domani e poi ti faccio sapere
Titolo: Re:Memory Leak
Inserito da: nomorelogic - Aprile 16, 2012, 12:01:27 pm
purtroppo credo ci saranno altre cose da sistemare
per ora ho individuato 2 file con delle dichiarazioni legate all'ambiente Win32:
- ascdef.inc (Declarations for all the Win32 ASCII Functions)
- struct.inc ( Declarations for all the Windows32 API Structures)