![]() |
Pinger Tool
Hallöchen! Ich versuche in Delphi ein Chat-Programm zu realisieren und arbeite mit den alten ClientSocket und ServerSocket Komponenten. Im Moment hänge ich bei folgendem Problem:
Meine Klasse TPinger leitet sich von TThread ab, ich versuche zu jeder vollen Sekunde alle am Chat beteiligten Personen zu pingen. Die PING() Methode im Code unten macht lediglich folgendes:
Delphi-Quellcode:
Socket.SendText('PING!');
Delphi-Quellcode:
So weit so gut. Das Programm startet und läuft auch ohne Probleme, die Pings kommen zügig an und alles scheint bestens. Beim Disconnecten des Clients jedoch, crasht das Programm vollständig. Fehlermeldung gibt es keine direkt. Läuft die Anwendung außerhalb der Entwicklungsumgebung, so crasht sie einfach ("Projekt1.exe funktioniert nicht mehr und muss beendet werden."). Lasse ich das Projekt innerhalb der Entwicklungsumgebung zum Fehler kommen, poppt der Debugger auf und zeigt mir irgendeinen Assembler-Code oder so.
procedure TPinger.Execute;
begin while not Terminated or (benutzer <> nil) or (benutzer.getSocket <> nil) do begin benutzer.PING(); Sleep(1000); end; end; Mein Verdacht liegt darin, dass der Thread trotz Anweisung bei fehlendem "Benutzerobjekt" oder dem fehlenden Socket des Benutzerobjekts abzubrechen einfach nicht abbricht sondern ins leere tritt und stirbt. Jemand ne idee wie ich das Problem lösen könnte? Mfg Balthasar |
AW: Pinger Tool
Wie wäre es mit and?
|
AW: Pinger Tool
Zitat:
|
AW: Pinger Tool
and ist schon richtig
wenn man es etwas umschreibt (nur zum Verständnis) dann wird's eindeutiger warum:
Delphi-Quellcode:
while (not Terminated) and (not benutzer = nil) and (not benutzer.getSocket = nil) do
Zitat:
|
AW: Pinger Tool
Zitat:
|
AW: Pinger Tool
Komisch, vllt lebe ich in einer invertierten Welt :D
Vielen Dank bislang, aber es geht immer noch nicht, gleicher Fehler :( |
AW: Pinger Tool
Wenn dein Hauptformular geschlossen wird, solltest du den Thread(s) höflich mitteilen, dass jetzt Schluß ist:
Delphi-Quellcode:
Grundsätzlich ist es gefährlich, wenn Threads weiterlaufen aber der Hauptthread terminiert wird.
mythread.Terminate; // setzt property Terminated auf True
Sleep(1050); // warten bis Thread sich selbst beendet hat 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
Delphi-Quellcode:
reagieren so verringern:
Terminate
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; |
AW: Pinger Tool
Zitat:
Mittlerweile ist mein Problem auch komplett gelöst, im While-Block fehlte lediglich eine weitere Bedingung an die ich anfangs nicht dachte: (benutzer.getSocket.connected). Mittlerweile kämpfe ich gegen andere Probleme, aber die schaffe ich schon wenn ich etwas mehr beider Sache bin :D Danke nochmals an alle Helfer!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz