![]() |
Indy: Ausserhalb von OnExecute senden?
Hallo
Ich bin gerade dabei mich in die Indy-Komponenten einzuarbeiten. Eine TCP Server - Client Verbindung klappt auch schon ganz gut. Nun habe ich aber folgendes Problem: Der Server soll, nachdem einmal von Client-Setie aus eine Verbindung hergestellt wurde jederzeit senden. Das heißt: Es kann sein das der Server sofort was zurückschickt, aber ev. auch erst nach 20 min. Beim Client löse ich das Problem, indem ich die ReadLN Methode in einer Schleife laufen lasse (eigener Thread) Wie kann ich aber mit dem Server senden? Direkt auf eine Verbindung antworten geht ja in dem OnExecute-Event. Aber ausserhalb dieses Threads ist ja die Verbindung nicht bekannt. Ich habe irgentwas davon gehört das man die Clients in eine Clientlist oder so packen kann. Habe aber dazu nichts richtiges gefunden. P.S. : Indy 10 Delphi2005 |
Re: Indy: Ausserhalb von OnExecute senden?
Hi,
ich weiß jetzt nicht was für Listen Indy dir schon direkt zur Verfügung stellt. Aber du kannst das ganze auch selber machen. Erstell dir einfach eine TObjectList. In diese fügst du bei jedem Connect den neuen TIdPeerThread hinzu, wichtig, bei Disconnect entfernst du die dann natürlich auch wieder. Wenn du nun etwas senden möchtest, so kannst du über die Items der TObjectList iterieren und an jeden hier eingetragenen TIdPeerThread etwas senden (dazu das entsprechende Item vorher casten). Ansonsten solltest du dir vielleicht noch den TIdThreadMgr anschauen, hört sich zumindest nach etwas Richtigem an. Gruß Der Unwissende |
Re: Indy: Ausserhalb von OnExecute senden?
Hi.
Versteh ich das so richtig: ich habe ne TObjectList (was immer das auch ist ;-) Bin noch nicht so fit in Delphi) Dort trage ich beim OnConnect-Event des Servers den übergebenen TIdPeerThread ein. Wenn ich nun was senden will nehme ich z.B. TIdPeerThread nr. 2 von der liste. Was meinst du damit das ich das item casten muss? Bittet indy nicht irgentwo schon so eine Verwaltung an? Ich glaube ich habe da mal was gelesen. Kann mich aber nicht genau erinnern. Danke erstmal für die Antwort |
Re: Indy: Ausserhalb von OnExecute senden?
ich glaube der threadmanager von indy ist das was du unter verwaltung von indy aus meinst. bin mir nicht sicher, hab es bisher auch immer selbst gecoded
Zitat:
und bei zeigern weis man meistens nicht, was sie für ein typ haben also sagt man dann dem compiler, das ein item aus der objectlist ein "tidpeerthread" ist und schon kann man damit weiter arbeiten
Delphi-Quellcode:
so ungefär :)
(objectlist.items[0] as tidpeerthread).socket....
und pass auf, wenn du auf die objekte zugreifst, wenn du das aus threads heraus machst. denn die können ja bekannter weise auch gleichzeitig auf die liste zugreifen und dann gibts evtl datensalat ;) also immer schön mit synchronisation arbeiten pseudocode:
Delphi-Quellcode:
hoffe in der schnelle geholfen zu haben.
criticalsection.enter;
objectlist.delete(zulöschendesitem); criticalsection.leave; |
Re: Indy: Ausserhalb von OnExecute senden?
Ok. Danke. Werde ich morgen mal ausprobieren.
Nachtrag: Hat super funktioniert. Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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