Hi!
Ich glaube dein Programm ist in folgenden Zeilen "zu schnell" ...
Code: Alles auswählen
FServer.Server.Active:=false;
if FServer.Server.Active then ...
Das Setzen auf false weist die Listen-Schleife im Thread an, sich bei nächster Gelegenheit zu beenden. In der nächsten Zeile ist das aber noch nicht passiert, weil der andere Thread zwischenzeitlich noch gar nicht wieder ausgeführt wurde und noch gar nicht mitgekriegt hat, dass er sich beenden soll. Die Abfrage .Active ist keine Variable, sondern eine Funktion, und liefert deshalb wohl immer noch true zurück.
Ich würde deshalb .FreeOnTerminate:=true; setzen, damit du dich nicht darum zu kümmern brauchst. In deinem Programm hast du .FreeOnTerminate ausgeklammert.
Ich würde dir auch raten dein TForm1.FServer in .FServerThread umzubennen, denn FServer.Server ist verwirrend und macht nicht klar, welches der Thread ist.
Funktionsweise ... In THTTPServerThread.Execute() wird mittels FServer.Active:=true; eine Funktion aufgerufen, die eine Listen-Schleife enthält.
Dieser Aufruf FServer.Active:=true; kehrt nicht zurück! Das ist sehr komisch umgesetzt, denn man würde nicht erwarten, dass das bloße Setzen einer scheinbaren "Variable" auf true, nicht zurückkehrt.
Und zwar kehrt es solange nicht zurück, bis von einem anderen Thread aus (dem Hauptprogramm) wieder FServer.Active:=false gesetzt wurde.
Sobald nach FServer.Active:=false der ServerThread bei nächster Gelegenheit wieder ausgeführt wird, wird die Listen-Dauerschleife verlassen, wodurch erst das ursprüngliche .Execute() verlassen wird.
Wenn .FreeOnTerminate:=true gesetzt war, zerstört sich der ServerThread nach nun verlassenem .Execute() von selbst.
Blöd dabei ist, dass die Referenz auf das Thread-Objekt in TForm1 bei .FreeOnTerminate nicht auf NIL gesetzt wird.
Um das zu lösen, habe ich eine abgeleitete Klasse des Thread erstellt, darin .Destroy überschrieben, wofür ich mir einen Pointer auf einen Pointer hinterlegt habe, der letztlich TForm1.FServerThread auf NIL setzt.
Ist alles ein bisschen umständlich.
Grüße, Jörg