Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy, ReadBuffer <- abbrechen (https://www.delphipraxis.net/109872-indy-readbuffer-abbrechen.html)

Jackie1983 9. Mär 2008 11:56


Indy, ReadBuffer <- abbrechen
 
hi,

kann man einen ReadBuffer abbrechen?
Delphi-Quellcode:
AThread.Connection.ReadBuffer(header,sizeof(header));
Delphi-Quellcode:
AThread.Connection.Cancel; //irgend wie so
Brauche das weil ich wo anders im script auf ein ReadLn warte.
Eventuell kann ich auch ein TimeOut einstellen....

SirThornberry 9. Mär 2008 12:02

Re: Indy, ReadBuffer <- abbrechen
 
Dann lese doch einfach in kleineren Stücken und nicht alles auf einmal. Oder lese nur wenn auch Daten vorhanden sind.

Jackie1983 9. Mär 2008 12:06

Re: Indy, ReadBuffer <- abbrechen
 
wie kann ich den nur lesen wenn auch nur daten vorhanden sind?
Der server weis doch nicht wann daten kommen....

Jackie1983 9. Mär 2008 12:58

Re: Indy, ReadBuffer <- abbrechen
 
vielleicht hat jemand noch ein idee wie ich es anders machen kann.
Delphi-Quellcode:
//Execute vom TCPidServer
procedure TMyServer.OnExecute(AThread: TIdPeerThread);
begin
  //#Header
  AThread.Connection.ReadBuffer(header,sizeof(header));
  //#Daten
  ...
end;
Daten vom Server an alle Clients senden
Delphi-Quellcode:
//Befehl senden
procedure TfrmServerMain.cmdSendDataClick(Sender: TObject);
var
  header : TDTSHeader;
  daten : TDTSDaten;
  checksum:TDTSChecksum;
  s : string;
  i : integer;
begin
  //Header füllen
  ...
  for i:=0 to fServer.Clients.Count-1 do
  begin
    (fServer.Clients.Objects[i] as TIdPeerThread).Connection.WriteBuffer(header,sizeof(TMyHeader));
    (fServer.Clients.Objects[i] as TIdPeerThread).Connection.WriteBuffer(daten,sizeof(TDaten));
    //Auf antwort warten
    s := (fServer.Clients.Objects[i] as TIdPeerThread).Connection.Readln;
    log.Lines.add((fServer.Clients.Objects[i] as TIdPeerThread).Connection.Socket.Binding.IP+' '+s);
  end;
end;
wenn ein client sich verbindet wird die execute aufgerufen, deswegen wartet er bei ReadBuffer(header...

wenn ich jetzt einen befehl senden möchte warte ich auch eine bestätigung, aber er wartet ja in der Execute methode......

Vielleicht hat jemand noch eine andere idee.

SirThornberry 9. Mär 2008 15:16

Re: Indy, ReadBuffer <- abbrechen
 
Schau dir mal AThread.Connection.InputBuffer.Size, AThread.Connection.InputBuffer und AThread.Connection.ReadFromStack an.

Wenn du AThread.Connection.ReadBuffer aufrufst wird in einer Schleife so oft AThread.Connection.ReadFromStack aufgerufen bis AThread.Connection.InputBuffer.Size so groß ist wie du Daten lesen willst. Du kannst also auch selbst AThread.Connection.ReadFromStack aufrufen und schauen ob überhaupt Daten verfügbar sind die gelesen werden müssen.

Es wäre übrigens Interessant zu wissen welche Delphiversion du verwendest und welche Indyversion du verwendest. Eigentlich sollten bei deiner Version auch die Quelltext von den Indys dabei sein so das du da auch selbst schauen kannst.

Jackie1983 9. Mär 2008 15:37

Re: Indy, ReadBuffer <- abbrechen
 
indy 9 und delphi 7

ok dann werde ich mal schauen.
Delphi-Quellcode:
    while (InputBuffer.Size < AByteCount) do begin
      ReadFromStack;
      CheckForDisconnect(True, True);
    end;
thx für den hinweis.

Jackie1983 9. Mär 2008 18:11

Re: Indy, ReadBuffer <- abbrechen
 
in ReadFromStack ist auich eine repeat schleife :( also kann ich das auch vergessen.

meine vorstellung ist, das es eine methode gibt die wartet bis daten ankommen.
wenn ich einen befehl schicke und auf eine antwort warte, soll die methode die oben wartet beendet wird, so das die daten in dieser methode empfangen werden wo auch der befehl abgesendet wurde.

Jackie1983 9. Mär 2008 19:26

Re: Indy, ReadBuffer <- abbrechen
 
habe jetzt eine idee.

im server wird per button daten versendet
Delphi-Quellcode:
...
    TerminateThread((fServer.Clients.Objects[i] as TIdPeerThread).Handle,ExitCode);
    (fServer.Clients.Objects[i] as TIdPeerThread).Connection.WriteBuffer(header,sizeof(Theader));
    (fServer.Clients.Objects[i] as TIdPeerThread).Connection.WriteBuffer(daten,sizeof(Tdaten));
    (fServer.Clients.Objects[i] as TIdPeerThread).Connection.WriteBuffer(checksum,sizeof(checksum));
    s := (fServer.Clients.Objects[i] as TIdPeerThread).Connection.Readln;
    log.Lines.add((fServer.Clients.Objects[i] as TIdPeerThread).Connection.Socket.Binding.IP+' '+s);
    //Thread wieder starten
    ?
...
der thread wo mit ReadBuffer auf daten gewartet wird, wird beendet.
nur wie kann ich den thread wieder starten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 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