Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 10.06.04 19:23
Hi,
ich übertrage Daten mithilfe der Indykomponenten TPCServer u. Client (Stream). Nun möchte ich gerne wissen, wie schnell die Daten übertragen werden.
Dazu möchte ich noch wiessen, wie lange es ungefähr dauert, bis die Daten vollständig übertragen sind.
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
DaRkFiRe
      
Beiträge: 526
WinXP Home & Professional
C, C++, Delphi
|
Verfasst: Do 10.06.04 23:18
Zum Anfang der Datenuebertragung holste Dir den aktuellen Timestamp (GetTickCount). Zum Zeitpunkt einer Zeitmessung holst Du Dir einen neuen Timestamp und berechnest Die Differenz.
Nun ist Transferierte_Datenmenge/ZeitDifferenz_in_Sekunden gleich Deine Uebertragungsgeschwindigkeit. Willst Du wissen, wieviel Zeit noch zur vollstaendigen Uebertragung bleibt, musst Du Gesamtdatenmenge_minus_uebertragene_Datenmenge/Uebertragungsgeschwindigkeit_in_Sekunden rechnen und schon haste die verbleibende Zeit in Sekunden.
_________________ Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Fr 11.06.04 19:32
nun gut, soweit hab ich es ja auch verstanden, doch wie komme ich an diese Daten ran?
Wie das mit dem Timestamp ist, hast du ja schon geschrieben... wie bekomme ich jetzt raus, wieviel von der Datei schon übertragen wurde?
Und was ist bei
Zitat: | Transferierte_Datenmenge/ZeitDifferenz_in_Sekunden |
mit
ZeitDifferenz_in_Sekunden gemeint?
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Sa 12.06.04 09:48
Die Clientkomponente hat die Ereignisse OnWorkBegin, OnWork und OnWorkEnd. Diesen Events werden Größe der Datenmenge und bereits transferierte Datenmenge übermittelt.
hibbert hat folgendes geschrieben: | Und was ist bei
Zitat: | Transferierte_Datenmenge/ZeitDifferenz_in_Sekunden | mit
ZeitDifferenz_in_Sekunden gemeint?
thx hibbert |
ZeitDifferzent_in_Sekunden=(AktuellerTimestamp-AlterTimestamp) div 1000; // Timestamps sind in ms
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Sa 12.06.04 17:58
ok, danke, doch in der Procedure Delphi-Quelltext 1: 2:
| procedure TForm1.ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); |
ist AWorkCountMax sicherlich die Dateigröße, doch diese größe ist bei mir immer 0, warum?
und das mit der verbleibenden Zeit stimmt auch nicht so ganz:
Delphi-Quelltext 1: 2: 3:
| aktuellertimestamp:=GetTickCount; statusbar1.Panels[1].Text:=inttostr((AktuellerTimestamp-AlterTimestamp) div 1000); altertimestamp:=GetTickCount; |
Diese Procedure hatte ich bereits in einem Timer und in der Procedure OnWork des Clieneten drin...
als ergebnis erhalte ich immer nur eine 1 oder eine 0....
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Sa 12.06.04 18:31
hibbert hat folgendes geschrieben: | ok, danke, doch in der Procedure Delphi-Quelltext 1: 2:
| procedure TForm1.ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); |
ist AWorkCountMax sicherlich die Dateigröße, doch diese größe ist bei mir immer 0, warum? |
AThread.Connection.WriteStream(Stream,True, True);
Das dritte True teilt dem Client vorher mit, wieviele Bytes auf ihn warten. Ich hab's allerdings lange nicht mehr gemacht - garantieren kann ich für nix.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Sa 12.06.04 20:14
mhh, das ist immernoch 0
irgentwie funzt das noch nicht....
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: So 13.06.04 09:30
Poste doch mal bitte ein wenig Quellcode.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: So 13.06.04 13:10
ok, kein problem: Client
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| var Form1: TForm1; AktuellerTimestamp,AlterTimestamp:integer;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject); begin
try Client.Connect(15000); button1.Enabled:=true; button2.Enabled:=false; except on E: Exception do MessageDlg ('Fehler beim Verbinden:'#13+ E.Message, mtError, [mbOk], 0); end;
end;
procedure TForm1.Button1Click(Sender: TObject); var FStream: TFileStream; begin button2.Enabled:=true; button1.Enabled:=false; animate1.Visible:=true; FStream := TFileStream.Create('C:\client.tmp', fmCreate); try Client.ReadStream(FStream, -1, True); FStream.Seek(0, soFromBeginning); finally FStream.Free; end; end; procedure TForm1.ClientStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); begin statusbar1.Panels[0].Text:=astatustext; end;
procedure TForm1.ClientWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin try progressbar1.Position:=strtoint(button1.Caption); except beep; end; button1.Caption:=inttostr(aworkcount); aktuellertimestamp:=GetTickCount; statusbar1.Panels[1].Text:=inttostr((AktuellerTimestamp-AlterTimestamp) div 1000); altertimestamp:=GetTickCount; end;
procedure TForm1.ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin altertimestamp:=GetTickCount; progressbar1.Max:=AWorkCountMax; button2.Caption:=inttostr(AWorkCountMax); end;
procedure TForm1.ClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin statusbar1.Panels[0].Text:='Übertragung erfolgreich. -- Verbindung getrennt --'; end; |
Server:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var FStream: TFileStream; begin FStream := TFileStream.Create('d:\test.zip', fmOpenRead); try AThread.Connection.OpenWriteBuffer; AThread.Connection.WriteStream(FStream,true,true); AThread.Connection.CloseWriteBuffer; finally AThread.Connection.Disconnect; FStream.Free; end; end; |
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 16.06.04 15:16
Schreib doch mal in Codezeile 35 des Clients nur Client.ReadStream(FStream);. Dann sollte eigentlich alles funktionieren. Nun muss ReadStream den WorkCountMax auslesen, um zu wissen, wann es reicht
Noch ein Tipp, wenn du Zeile 7 und 9 des Servers weglässt, sparen Server und Client ein wenig Zeit.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mi 16.06.04 16:50
ok, das mit der progressbar funzt jetzt, aber die "wie lange es noch dauert" Anzeige funzt noch net
Was ist denn an meiner Rechnung falsch?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| var Form1: TForm1; AktuellerTimestamp,AlterTimestamp:integer;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject); begin
try Client.Connect(15000); button1.Enabled:=true; button2.Enabled:=false; except on E: Exception do MessageDlg ('Fehler beim Verbinden:'#13+ E.Message, mtError, [mbOk], 0); end;
end;
procedure TForm1.Button1Click(Sender: TObject); var FStream: TFileStream; begin button2.Enabled:=true; button1.Enabled:=false; animate1.Visible:=true; FStream := TFileStream.Create('C:\client.tmp', fmCreate); try Client.ReadStream(FStream, -1); FStream.Seek(0, soFromBeginning); finally FStream.Free; end; end; procedure TForm1.ClientStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); begin statusbar1.Panels[0].Text:=astatustext; end;
procedure TForm1.ClientWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin try progressbar1.Position:=strtoint(button1.Caption); except beep; end; button1.Caption:=inttostr(aworkcount); aktuellertimestamp:=GetTickCount; statusbar1.Panels[1].Text:=inttostr((AktuellerTimestamp-AlterTimestamp) div 1000); altertimestamp:=GetTickCount; end;
procedure TForm1.ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin altertimestamp:=GetTickCount; progressbar1.Max:=AWorkCountMax; button2.Caption:=inttostr(AWorkCountMax); end;
procedure TForm1.ClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin statusbar1.Panels[0].Text:='Übertragung erfolgreich. -- Verbindung getrennt --'; end; |
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 17.06.04 14:45
Schreib mal zwischen Zeile 65 und 66 noch ein Application.ProcessMessages;.
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
|