![]() |
Records als Stream versenden
Hi,
heute sehe ich den Wald vor lauter Bäumen nicht... und irgenwie finde ich auch keine Demo bei den Indy9 und 10 demos.. ich versuche records in einem Rutsch per Stream mit Indy 10 TCPserver an den TCPclient zu senden ...was soweit auch funktioniert aber wenn ich den stream auslese... komm ich nicht auf das gewünschte ergebnis richtig wäre 1 1 2 3 4 5 2 1 2 3 4 5 3 1 2 3 4 5 Ergebnis ist aber 5 0 1 2 3 1082130432 5 0 1 2 3 1082130432 5 0 1 2 3 1082130432
Delphi-Quellcode:
// definition des records bei Client und Server
type TDataStream = record Sdatetime : integer; Sopen : single; Shigh : single; Slow : single; Sclose : single; Svolume : integer; end;
Delphi-Quellcode:
procedure TForm1.tcpServerExecute(AContext: TIdContext);
var Msg, MsgStr : String; Datastream : TMemoryStream; streamdata : Tdatastream; begin //... Msg := AContext.Connection.iohandler.ReadLn; MsgCom :=strtoint(Msg[1]); MsgStr:=trim(Msg); delete(MsgStr,1,1); // ... case MsgCom of // ... stGetData : begin datastream:=Tmemorystream.create; for i:=1 to 1000 do begin streamdata.Sdatetime:=i; streamdata.Sopen :=1; streamdata.shigh :=2; streamdata.Slow :=3; streamdata.Sclose :=4; streamdata.Svolume :=5; datastream.Write(streamdata,sizeof(streamdata)); end; datastream.Position:=0; IDS := TidStreamVCL.Create(datastream); with AContext.Connection do begin iohandler.writebufferopen; // Stream versenden iohandler.WriteLn(inttostr(stGetData)); // KommandoProtokol Socket.Write(IDS,0,true); iohandler.writebufferclose; end; datastream.Free; end;
Delphi-Quellcode:
Danke für die Hilfe
// Client Timer GetMessage
var IDS: Tidstreamvcl; datastream: Tmemorystream; streamdata: Tdatastream; I, size: integer; // .... case MsgCom of // .... stGetData : begin timergetmessage.Enabled:=false; datastream:=Tmemorystream.Create; IDS:=Tidstreamvcl.create(datastream); size:=24000; // zum testen fest gesetzt tcpclient.socket.ReadStream(IDS,Size,false); datastream.Position:=0; with streamdata do begin while datastream.Position<datastream.Size do begin datastream.Read(streamdata,sizeof(streamdata)); MemoAdd(inttostr(Sdatetime)+' ' + inttostr(trunc(Sopen))+' ' + inttostr(trunc(Shigh))+' ' + inttostr(trunc(Slow))+' ' + inttostr(trunc(Sclose))+' ' + inttostr(Svolume)); end; end; end; Ralf |
Re: Records als Stream versenden
Hi,
ich hab den Fehler im Client lokalisiert - hier die Lösung: ersetze
Delphi-Quellcode:
durch
size:=24000; // zum testen fest gesetzt
tcpclient.socket.ReadStream(IDS,Size,false);
Delphi-Quellcode:
dann funktioniert es (getestet mit 900.000 Datensätzen)
size := tcpclient.Socket.ReadInteger;
tcpclient.Socket.ReadStream(IDS, Size); Gibt es eigentlich einen Grund warum hier scheinbar niemand mit Indy 10 arbeitet ? hat Indy 9 irgendwelche vorteile - ausser das alle demos die man so findet in Indy 9 sind ?! cu Ralf |
Re: Records als Stream versenden
Danke dir! Genau sowas hab ich gesucht!
Warum aber anscheinend kaum jemand mit den 10ern arbeitet kann ich dir auch nicht beantworten. Ich vermute aber, dass es daran liegt, das ja doch einiges umgeschmissen wurde und viele ihre Projekte dann umschreiben müssten. Das hat zumindest nen Bekannten von mir davon abgehalten. |
Re: Records als Stream versenden
Zitat:
Viele wissen vieleicht gar nicht, das es eine neue Version gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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