Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Indy-TCP/IP-Listener aktiv?


hesch21 - Mi 22.11.06 13:39
Titel: Indy-TCP/IP-Listener aktiv?
Hallo allerseits
ich komme mir mal wieder richtig dämlich vor! Ich habe ein Programm mit 2 Indy-TCP/IP-Server und den zugehörigen Listener (OnExecute). Dasselbe Programm hat aber auch noch einen Timer, in dessen OnTimer-Event periodisch (stündlich) Daten gesichert werden.
Alle drei Events (also die beiden Listener und der Timer) greifen auf dieselben Variablen und auf eine DB-Tabelle zu! Damit das funktioniert, verwende ich bei den Listener eine Critical Section.
Das Programm läuft auch einwandfrei, solange nicht der Timer aktiv wird, während einer der Listener (unter Umständen sogar mehrfach) aktiv ist. Wenn aber dies eintrifft (im produktiven Betrieb des Programms, das im Dauerbetrieb läuft, passiert das so ca. alle 2 Wochen einmal), dann blockiert sich das Programm. Keine Fehlermeldung, nichts. Weder der Einbau von Eureka oder Madshi haben was gebracht, um heraus zu finden, wo das Programm hängen bleibt. Von der Reaktion der Clients aus zu schliessen, bleibt der entsprechende Listner-Thread aber einfach auf einem AContext.Connection.IOHandler.ReadLn hängen.
Mein Lösungsansatz wäre nun eigentlich, einfach mit der Ausführung des OnTimer-Events zu warten, bis keine Listener-Threads mehr aktiv sind und während dessen Ausführung zu verhindern, dass ein Listener-Thread gestartet werden kann.
Und da kommt nun meine 'Dämlichkeit' ins Spiel. Ich habe keine Ahnung, wie ich so was machen kann. Konkret: Wie finde ich heraus, ob gerade ein Listener-Thread läuft und wie kann ich verhindern, dass ein neuer Listner-Thread gestartet wird?


Udontknow - Mi 22.11.06 13:55

Hallo!

Verwende einfach im Timer auch diese Criticalsection.

Cu,
Udontknow


hesch21 - Mi 22.11.06 13:59

Wie gesagt: Dämlich! Darauf hätte ich wirklich selbst kommen können! Ich bin fast sicher, dass dies die Lösung ist. Herzlichen Dank!