Wenn dein Hauptformular geschlossen wird, solltest du den Thread(s) höflich mitteilen, dass jetzt Schluß ist:
Delphi-Quellcode:
mythread.Terminate; // setzt property Terminated auf True
Sleep(1050); // warten bis Thread sich selbst beendet hat
Grundsätzlich ist es gefährlich, wenn Threads weiterlaufen aber der Hauptthread terminiert wird.
Dazu musst du natürlich die Thread-Objekte in einer Variablen speichern, damit du beim Programmende darauf zugreifen kannst.
Der Sleep()-Aufruf ist zwar etwas primitiv, weil so die ganze Anwendung min. 1 Sekunde nicht reagiert aber als schnelle, einfache Lösung geht das schon.
Du kannst die Reaktionszeit bis die Threads auf das
Terminate
reagieren so verringern:
Delphi-Quellcode:
procedure TPinger.Execute;
var
i : Integer;
begin
i := 0;
while not Terminated or (benutzer <> nil) or (benutzer.getSocket <> nil) do
begin
if i mod 5 = 0 then
benutzer.PING(); // 1 Ping ungefähr alle 1000ms
Inc(i);
Sleep(200);
end;
end;