Hallo,
ich habe irgendwo in einem Programmteil von mir ein Memoryleak und ich finde es einfach nicht. Dazu habe ich mal eine Frage und zwar verwende ich einen TIdTCPServer um bestimmt Prozesse zu überwachen.
Das ganze läuft so ab, zuerst wird ein Request gesendet:
Delphi-Quellcode:
procedure TMainForm.CommandServerinitPDSWatchCommand(ASender: TIdCommand);
begin
syncAddLog('initpdswatch von ' + ASender.Thread.Connection.Socket.Binding.PeerIP + ' empfangen');
if ASender.Params.Count > 1 then
PDS.addWatcher(ASender.Thread, strToIntDef(ASender.Params[0], pds_WatchAll), boolean(strToIntDef(ASender.Params[1], 0)));
end;
Danach werden die ASender.Threads korrekt synchronisiert an einen Thread übergeben, welcher parallel zur Anwendung läuft, Daten sammelt und an die connecteten Clients übergibt.
Das ganze sieht ungefähr so aus:
Delphi-Quellcode:
// TOSend(Pointerliste) enthält nun alle connections und Daten die versendet werden müssen
for wdh:= ToSend.count-1
downto 0
do
begin
SI:= ToSend[wdh];
if not terminated
then
begin
try
SI.PeerThread.Connection.OpenWriteBuffer;
SI.Daten.sendOverIndyPeerThread( Si.PeerThread, Si.komprimiert, SI.abZeit);
SI.PeerThread.Connection.CloseWriteBuffer;
except
syncAddLog('
watchThread Exception 4');
try
SI.PeerThread.Connection.CancelWriteBuffer;
except
syncAddLog('
watchThread Exception 4.5');
end;
end;
end;
dispose( SI);
end;
Nun wie gesagt wird das Programm immer grösser und ich suche bereits seit 2 Wochen nach dem Leak, der Code ist ansonsten 100%ig korrekt und irgendwelche MemCheck - Hilfsunits haben ebenfalls nichts gefunden. Das Einzige was mir noch einfällt ist, dass es irgendwie ein Problem mit dem Indyserver in Bezug auf synchronisierung(?) geben könnte.
Ansonsten verwende ich noch exzessiv TBitmap in dem Thread, könnte es sein dass dieses ein Memoryleak hat? Kann mir da jemand was zu sagen, darf man so auf die PeerConnections zugreifen?
Danke,
Volker
Wer später bremst ist eher tot.