Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Server mit Liste aus Records crasht

  Alt 26. Sep 2008, 09:39
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.
  Mit Zitat antworten Zitat