AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Threads, welche Lösung haltet Ihr für eleganter ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von DataCool · begonnen am 27. Jun 2006 · letzter Beitrag vom 29. Jun 2006
 
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, 12: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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