AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy, ReadBuffer <- abbrechen

Indy, ReadBuffer <- abbrechen

Ein Thema von Jackie1983 · begonnen am 9. Mär 2008 · letzter Beitrag vom 9. Mär 2008
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 11:56
hi,

kann man einen ReadBuffer abbrechen?
AThread.Connection.ReadBuffer(header,sizeof(header)); 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....
  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: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 12:02
Dann lese doch einfach in kleineren Stücken und nicht alles auf einmal. Oder lese nur wenn auch Daten vorhanden sind.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 12:06
wie kann ich den nur lesen wenn auch nur daten vorhanden sind?
Der server weis doch nicht wann daten kommen....
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#4

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 12:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 15:16
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#6

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 15:37
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.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#7

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 18:11
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.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#8

Re: Indy, ReadBuffer <- abbrechen

  Alt 9. Mär 2008, 19:26
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?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:08 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