![]() |
Indy, ReadBuffer <- abbrechen
hi,
kann man einen ReadBuffer abbrechen?
Delphi-Quellcode:
AThread.Connection.ReadBuffer(header,sizeof(header));
Delphi-Quellcode:
Brauche das weil ich wo anders im script auf ein ReadLn warte.
AThread.Connection.Cancel; //irgend wie so
Eventuell kann ich auch ein TimeOut einstellen.... |
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.
|
Re: Indy, ReadBuffer <- abbrechen
wie kann ich den nur lesen wenn auch nur daten vorhanden sind?
Der server weis doch nicht wann daten kommen.... |
Re: Indy, ReadBuffer <- abbrechen
vielleicht hat jemand noch ein idee wie ich es anders machen kann.
Delphi-Quellcode:
Daten vom Server an alle Clients senden
//Execute vom TCPidServer
procedure TMyServer.OnExecute(AThread: TIdPeerThread); begin //#Header AThread.Connection.ReadBuffer(header,sizeof(header)); //#Daten ... end;
Delphi-Quellcode:
wenn ein client sich verbindet wird die execute aufgerufen, deswegen wartet er bei ReadBuffer(header...
//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 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. |
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. |
Re: Indy, ReadBuffer <- abbrechen
indy 9 und delphi 7
ok dann werde ich mal schauen.
Delphi-Quellcode:
thx für den hinweis.
while (InputBuffer.Size < AByteCount) do begin
ReadFromStack; CheckForDisconnect(True, True); end; |
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. |
Re: Indy, ReadBuffer <- abbrechen
habe jetzt eine idee.
im server wird per button daten versendet
Delphi-Quellcode:
der thread wo mit ReadBuffer auf daten gewartet wird, wird beendet.
...
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 ? ... nur wie kann ich den thread wieder starten? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 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