AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdTCPClient.ReadLn kehrt nicht zurück!?
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPClient.ReadLn kehrt nicht zurück!?

Ein Thema von EConvertError · begonnen am 31. Okt 2003 · letzter Beitrag vom 31. Okt 2003
Antwort Antwort
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#1

TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 15:46
Hallo!

Ich denke diese Frage wurde schon einmal gestellt, aber ich habe trotz langem Suchen nichts dazu finden können.
Das Problem ist simpel: Ich habe da in einem Thread Folgendes:
IdTCPClient1.ReadLn('', 5, -1); Das ganze soll zum Empfangen der (Chat)Nachrichten dienen.
Wenn der Server eine Nachricht sendet, dann ist alles OK. Nur wenn gerade keine Nachricht da ist, dann kehrt die Funktion nicht zurück (bzw. erst wenn eine Nachricht kommt).
Es stört mich, weil derselbe Thread auch zum Verschicken der Nachrichten gebraucht wird und deshalb eben das Versenden blockiert ist.

Bis jetzt habe ich das Problem gelöst, indem ich vom Server jede Sekunde (mittels Timer) eine Art "Keep Alive" Signal zum Client gesandt habe.

Aber diese Lösung finde ich äußerst "unelegant". Weiß jemand eine Lösung, oder muss ich bei meiner bleiben?

mfg
EConvertError

PS: Ich arbeite mit Indy.
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 16:10
Readtimeout setzen...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#3

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 16:37
Hi!

Genau das wollte ich machen, aber das funktioniert nicht richtig.
Der zweite Parameter(die Nummer 5) sollte ja den Timeout darstellen.
IdTCPClient1.ReadLn('', 5, -1); Aber irgendwie funktioniert das nicht. Ich benutze die mit der Delphi 7 Pro mitgelieferte Indy Version (9.0).

mfg,
EConvertError
Andreas N.
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#4

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 16:45
mit IdTCPClient1.ReadTimeout:=100;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 16:47
Moin EConvertError,

das die Angabe des Timeouts in Millisekunden angegeben wird, ist Dir aber schon klar?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#6

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 17:12
Hallo!

Also im Prinzip weiß ich schon, dass die Angabe des Timeouts in Millisekunden angegeben wird. Die 5 Millisekunden habe ich vom Indy Chatdemo übernommen.

Ich habe es nun hiermit versucht:
Delphi-Quellcode:
 
if TCPClient.Connected= TRUE then begin
  TCPClient.ReadTimeout:= 100;
  fIncomingMsg:= TCPClient.ReadLn('', 100, -1);
end;
Aber irgendwie hat es nicht funktioniert. Was mache ich falsch? Warum zeigt das Timeout keine Wirkung?

Vielen Dank schon jetzt,
EConvertError
Andreas N.
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 17:22
versuch es mal so:
Delphi-Quellcode:
if TCPClient.Connected= TRUE then begin
  TCPClient.ReadTimeout:= 2000;
  fIncomingMsg:= TCPClient.ReadLn('', 2000, -1);
end;
Christian
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#8

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?

  Alt 31. Okt 2003, 17:51
Hallo!

Also ich habe auch das probiert, aber es hat keine Wirkung gezeigt- leider.

Beim IdTCPDemo (bei den Indy Demos dabei) wird folgendes gemacht:
Man definiert den IdTCPClienten im Hauptthread und greift zum Lesen von einem anderen Thread aus darauf zu:

Delphi-Quellcode:
while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
end;
Und zum Schreiben wird im Hauptthread einfach Folgendes gemacht:

Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true); Darf man das tun? Ich meine: Kann es da nicht sein, dass der "Lese"- Thread gleichzeitig mit dem Hauptthread auf den IdTCPClienten zugreift? Beim Demo funktioniert es, aber...

mfg,
EConvertError
Andreas N.
  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 04:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz