Ich sehe da jede Menge Dinge in deinem Sourcecode, nicht objektorientiert sind.
1.) mach aus dem Record eine Klasse und gibt der Klasse einen vernüftigen Namen (TConnectionData)
2.) statt TList verwende TObjectList. Damit werden die Objekte automtisch freigegeben, wenn du sie aus der Liste löschst
Mit deiner Procedure TListEx.Notify kannst du dir sehr leicht in den Fuß schiessen; überlass' das den getesteten KLassen aus der
VCL (damit meine ich TObjectList) und du bist das Problem los
3.) du startest Threads direkt über die Windows-
API anstatt die TThread-Klasse zu benützen.
das ist aber kurzsichtig.
Wenn du eine eigene Threadklasse von TThread ableitest, dann kannst du nach dem erzeugen die Objektliste mitgegeben
Delphi-Quellcode:
TWatchdogThread = class(TThread)
...
property ConnectionList:TObjectList read FConnectionList write FConnectionList;
end;
Damit brauchst du nicht mehr auf die globale Variable "Main" zuzugreifen.
Erkennst du den Vorteil?
Vorher: der Code ist fest mit dem Formular TMain und der Variable Main verbandelt.
Nachher: die Threadklasse bekommt von aussen gesagt was sie tun soll; ein Bezug zum Formular besteht nicht mehr.
Wenn du das alles beachtest wird aus einem hässlichen Code ein wesentlich schönerer und sicherer Code.
Delphi-Quellcode:
procedure TWatchdogThread.Execute;
var
count : integer;
begin
count := 0;
while not Terminated do
begin
Inc(count);
if (count mod 20) = 0 then
begin
CheckOldConnections; // prüfe alte Verbindungen uns lösche ggf.
RenewTimestampConnections;
end;
// dein sleep(20000) ist ganz schlecht
// das bedeutet, dass dein Thread bis zu 20s keine Reaktion auf Terminierung von Aussen zeigt
// Prozesse, deren Threads sich nicht in angemessener Zeit beenden lassen können zu Zombieprozessen werden!
// deshalb ist es besser 20mal eine Sekunde zu warten, dann reagiert der Thread einigermassen flüssig
Sleep(1000);
end;
end;
Ich habe einen Teil der Arbeit in die Methoden CheckOldConnections und RenewTimestampConnections verlegt.
Dadurch wird die Struktur klarer und es ist nicht alles in einer grossen unübersichtlichen Funktion.