AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCP Client/Server: spontan Nachricht an den Server senden?
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Client/Server: spontan Nachricht an den Server senden?

Ein Thema von romber · begonnen am 9. Jun 2013 · letzter Beitrag vom 10. Jun 2013
Antwort Antwort
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.167 Beiträge
 
Delphi 10 Seattle Professional
 
#1

AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?

  Alt 10. Jun 2013, 10:22
...Entweder ruft man die Prozedur dann nur z.B. jeden n-ten Durchlauf der Sendeschleife auf, oder - aber das ist ein wenig aufwendiger - man verlegt die Prozedur in einen eigenen Thread. Die beiden Streams des Sockets können von zwei verschiedenen Threads gleichzeitig benutzt werden - ein Sende-Thread, ein CheckForData-Thread.
Was bedeutet "aufwendiger" in diesem Fall? Nur dass ich einen neuen Thread abspalten muss, der auf IOHandler des Sockets zugreift oder muss ich da unbedingt noch was beachten? Muss ich die Zugriffe auf IOHandler sychnronisieren? Oder kann ich auf die Streams einzeln zugreifen?

Vielleicht könnte man mit select auch ohne zweiten Thread auskommen. Keine Ahnung wie Indy (uÄ) das unterstützen.

Mögliches Vorgehen:
  1. mit select auf Sende- und Empfangsrichtung warten
  2. In den Socket schreiben bzw. daraus lesen (jeweils nicht blockierend). In der zu bevorzugenden Richtung machst dabei weiter, bist du nicht mehr kannst, in der anderen Richtung verarbeitest du nur einen kleinen Buffer (wenn überhaupt).
  3. zurück zu 1.

Mit nicht-blockierenden Socketoperation lässt sich viel anstellen
Ich darf in der bereits bestehener Routine nicht viel verändern. Einen neuen Thread oder eine zusätzliche Prozedur, die ab und zu aufgerufen wird wäre noch kein Problem. Aber vielen Dank für den Vorschlag.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?

  Alt 10. Jun 2013, 12:13
Was bedeutet "aufwendiger" in diesem Fall? Nur dass ich einen neuen Thread abspalten muss, der auf IOHandler des Sockets zugreift oder muss ich da unbedingt noch was beachten? Muss ich die Zugriffe auf IOHandler sychnronisieren? Oder kann ich auf die Streams einzeln zugreifen?
Der Hauptaufwand liegt darin, dass durch einen zweiten Thread (der nur für das Empfangen von Daten zuständig ist) bedingt wird, die Kommunikation mit dem Hauptthread threadsicher zu gestalten. Der erforderliche Aufwand hängt davon ab, wie komplex die notwendige Kommunikation zwischen dem Hauptthread und dem Lesethread ist.

Der IOHandler wird unsynchronisiert verwendet (zu synchronisieren würde den Vorteil des zweiten Threads wieder aufheben. Der schreibende Thread darf dann aber auch nie lesen - sollte das erforderlich sein, muss synchronisiert werden damit nicht zwei Threads lesen.
Michael Justin
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.167 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?

  Alt 10. Jun 2013, 12:49
Der Hauptaufwand liegt darin, dass durch einen zweiten Thread (der nur für das Empfangen von Daten zuständig ist) bedingt wird, die Kommunikation mit dem Hauptthread threadsicher zu gestalten. Der erforderliche Aufwand hängt davon ab, wie komplex die notwendige Kommunikation zwischen dem Hauptthread und dem Lesethread ist.
Sehr kompliziert muss es nicht sein. Beim erfolgreichen Login wird ein Client-Object erzeugt, der neben der Referenz auf den IdContext des Sockets noch eine zusätzliche Variable für den neuen Thread enthält. Dieser Objekt wird wiederrum an IdContext des Sockets angehängt. Dann erstelle ich den Lesethread und lasse ihr auf die IdContext-Referenz des Hauptthreads zugreifen. Beim Freigeben des Hauptthreads prüfe ich, ob Lesethread existiert und beende ihn. Wäre das so threadsicher oder habe ich was vergessen?

Muss ich in beiden Threads aud IOHandler zugreifen oder kann ich irgendwie direkt auf Lese- bzw. Schreibstrem zugreifen?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?

  Alt 10. Jun 2013, 13:02
Wenn mich nicht alles täuscht, dann ist ein Socket immer nur in dem Thread verwendbar, in dem er erzeugt wurde. Unabhängig davon, ob man seine eigenen Datenstrukturen threadsicher hat oder nicht. Deshalb habe ich bei meinen Programmen meist eine Art "Dispatch-Thread" der den Socket hält, und an Queues der Worker-Threads eingehende Kommunikation verteilt, sowie ausgehende in einer eigenen Queue verwaltet.

Ich hatte zwar nicht Indy benutzt sondern die alten TClient- bzw. TServerSocket Kompos, aber imho dürfte man auch bei Indy auf die Nase fallen, wenn man einen Socket aus mehreren Threads heraus direkt benutzt. Ich bin halt nicht 100% sicher, aber das wäre überprüfungswürdig bevor man viel Zeit in ein Design steckt, dass am Ende doch nicht gehen könnte.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Indy TCP Client/Server: spontan Nachricht an den Server senden?

  Alt 10. Jun 2013, 13:26
Wäre das so threadsicher oder habe ich was vergessen?

Muss ich in beiden Threads aud IOHandler zugreifen oder kann ich irgendwie direkt auf Lese- bzw. Schreibstrem zugreifen?
Ja, das klingt überschaubar. Direkten Streamzugriff über Indy habe ich noch nicht versucht, es kommt aber nur darauf an ob der Socket "sichtbar" (und nicht z.B. 'private') ist.

Ich habe zwar Remy Lebeau so verstanden dass es im Prinzip gehen muss, aber bei Threads gilt "The proof of the pudding is in the eating"
Michael Justin
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:32 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