Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#11

Re: Threads, welche Lösung haltet Ihr für eleganter ?

  Alt 28. Jun 2006, 13:05
Im Falle der INDYs relativiert sich das aber.

Wir kennen alle die Excpetion "Connection closed gracefully". Ja, ein Ausnahme-bedingung und KEINE Fehlermeldung wie oft irrtümlich vermutet. Eben exakt das was EXCEPTION (auch wenn die DP für dieses Wort nur die halbe Wahrheit als Hint anzeigt ) auch bedeutet !

Du setzt den Timeout der TcpClient Komponente auf einen hohen Wert, zb. eben auch INFINITE. Dann rufts du einfach Readln() auf. Intern wird INDY mit Events auf neue Daten warten (wichtig ist das du auch die TcpClient Thread Methode benutzt, logisch). Dein Terminierungs Event entfällt vollständig !!
Denn wenn du deinen Client Thread extern beenden möchtest dann wird INDY intern den Socket asynchron sofot schließen. Das führt dann innerhalb deines .ReadLn() und somit innerhalb deiner Threadbasierten Schleife zu einer Exception, eg. Ausnahme -> Connection closed gracefully

Deine Aufgabe ist es also nur noch in deine Client Thread Methode das .ReadLn() in einem try except Block zu kapseln. Darin wirst du dann auf die Exception EConnectionClosedGracefully und ETimeout (oä.) speziell reagieren. Bei EConectionClosedGracefully terminierst du deine Threadschleife OHNE den Socket manuell zu schließen (er ist ja schon zu).

Ab diesem Moment wartet dein Thread in ReadLn() per Events, das kann ich für INDY garantieren.

Sooo, fehlt nur noch die Konfiguration des Betriebsystemes. Denn zb. in Win2k wartet das OS viele Stunden bevor es eine Socket Verbindung überprüft ob sie noch vorhanden (lebendig) ist. Sollte also der Server hart die Connection trennen so bekommt der Client dies auf solchen Rechnern erst nach vielen Stunden mit. Auf dieses Problem stießen wir selber erst mit dem Firebird Server. Schau mal im MSN nach dort steht beschrieben wie man in der Registry dieses Keepalive oä. einstellen kann.

Gruß Hagen
  Mit Zitat antworten Zitat