![]() |
IdTCPClient.ReadBuffer
hallo,
ich sitze an einem kleinen problem mit indy. ich habe einen server und 18 clients, die clients erhalten daten vom server jedoch nicht alle zur selben zeit, d.h. das die clients zwischen durch auch auf antworten warten müssen. das führt bei mir dummerweise immer wieder dazu das die clients die warten müssen abschmieren. daher meine frage: wenn ich IdAntiFreeze benutze kann ich dann einfach IdTCPClient.ReadBuffer(transport_record,SizeOf(tra nsport_record)); benutzen und der Client wartet dann solange bis er etwas vom server erhält? oder gibt es irgendeinen event den ich abfragen könnte um es dann so zumachen: repeat until 'netzwerkevent'; IdTCPClient.ReadBuffer(transport_record,SizeOf(tra nsport_record)); vielen dank im vorraus cya SWD |
Re: IdTCPClient.ReadBuffer
Du könntest die Read-Methode in eine Schleife setzen, den TimeOut auf 50ms stellen und alle EIdTimeOut-Exceptions (oder so ähnlich ;)) abfangen.
|
Re: IdTCPClient.ReadBuffer
danke, ich habe das mal mit ner schleife ausprobiert, habe dabei aber wohl ne endlosschleife produziert ;-), da wohl alles was der ReadBuffer zurückgibt als "Fehler" gewertet wird.
Delphi-Quellcode:
wie funktionier das mit der EIdTimeOut Exception? ich bin recht neu mit delphi dabei deswegen diese
IdTCPClient.ReadTimeout := 50;
fehler := false; repeat try IdTCPClient.ReadBuffer(transport_record,SizeOf(transport_record)); except fehler := true; end until not fehler; dumme frage. danke für jede hilfe cya SWD |
Re: IdTCPClient.ReadBuffer
Dein Verfahren ist grundsätzlich richtig, da man dafür eine Endlosschleife braucht.
Nun hat eine Endlosschleife eben den Nachteil, dass sie endlos dauert, und damit das Programm blockiert. Die Lösung ist, diese endlosschleife in einen Thread auszulagern, der bei Erfolg das gelesene Verarbeiten lässt. Dann würde man allerdings etwas wie folgt schreiben:
Delphi-Quellcode:
P.S. zum Thema Threads:
while not terminated do
try ReadBuffer(...); verarbeite_gelesenes(...); except end; end; ![]() |
Re: IdTCPClient.ReadBuffer
danke, aber ich habe halt nur marginale grundkentnisse... :-(
geht das denn nicht irgendwie einfach? ich habe meinen client schon fertig, das einzige was halt nicht funktioniert ist das warten auf antworten. und ich hatte gehofft, dass ich das mit ner simplen schleife hinbekomme ohne das prog nochmal komplett neu zuschreiben.. cya SWD |
Re: IdTCPClient.ReadBuffer
so ich habe das mal umgestellt und mit der (meiner meinung nach richtigen) exception
Delphi-Quellcode:
jedoch sagt der mir undeclared identifier für EIdReadTimeOut. warum? habe beispiele im netz gesehen bei denen das geklappt hat....IdTCPClient.ReadTimeout := 50; fehler := false; repeat try form1.IdTCPClient.ReadBuffer(transport_record,SizeOf(transport_record)); except on EIdReadTimeOut do begin fehler := true; end; end until not fehler; danke und cya SWD |
Re: IdTCPClient.ReadBuffer
Zitat:
?? |
Re: IdTCPClient.ReadBuffer
das problem liegt wohl woanderst.
es ist richtig, das der client solange wartet, bis er alles gelesen hat ( länge der zu lesenden bytes ) er wird solange blockierend darauf warten bis das letzte byte angekommen ist ergo: du musst auch soviel senden ! ergo: dein record muss haargenau vom selben typ sein wie der auf dem server du musst dir also mit readln oder readinteger irgend ein protocol erfinden, mit dem du alles drumherum handelst ("jetzt kommt der und der stream mit dem format") und dann mit readbuffer eine definierte länge liest somit ist es dann egal ob es länger dauert, bis der server seinen buffer übertragen hat, der client wartet einfach solange ( solange man kein timeout z.b. in readln angegeben hat ) wenn du aber einen endlosbuffer hast (stream einer webcam oderso) dann musst du das ding natürlich in einen thread auslagern und in einer endlosschleife solange lesen lassen, bis die connection flöten gegangen ist, oder deine evtl selbstgemachte timeout zuschlägt und den thread terminiert usw die thread - read methode ist besondert bei chats eingebaut, wo ein thread mit einer endlosschleife dauernd ReadLn macht und damit alles entgegennimmt und verarbeitet, was der server an den client schickt |
Re: IdTCPClient.ReadBuffer
Danke, habe es jetzt einfach mit Java gebaut,
aber ich werde es trotzdem mal ausprobieren, ärgert mich das ich da ein halbfertiges programm habe ;-) cya SWD |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 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