Entwickler-Ecke
Internet / Netzwerk - Indy: Übermittelte Bytes ermitteln
Yogu - Fr 04.04.08 17:24
Titel: Indy: Übermittelte Bytes ermitteln
Hallo,
ich programmiere gerade eine Update-Funktion für ein Programm. Da möchte ich eine Progress-Bar mit dem aktuellen Status einbauen. Die Gesamtgröße weiß ich, aber nicht, wie viel schon gesendet wurde. Die Eigenschaften und Funktionen von TIdHTTP hab ich schon durchgeschaut - nichts gefunden. Und hier im Forum ist auch nichts dazu.
Weiß jemand, wie man die übertragenden Bytes ermitteln kann? Danke! :D
Grüße,
Yogu
STS301 - Fr 04.04.08 17:29
Delphi-Quelltext
1: 2: 3: 4: 5:
| progressbar.min:=0; try finally progressbar.position:=100; |
Yogu - Fr 04.04.08 20:22
STS301 hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5:
| progressbar.min:=0; try finally progressbar.position:=100; | |
Danke für die Schnelle Antwort,
STS301. :D
Bedauerlicherweise Geht es mir aber mehr um den Teil zwischen 0% und 100%. Hat jemand einen besseren Vorschlag?
Grüße,
Yogu
meolus - Fr 04.04.08 21:44
Hallo, ich habe das in meinem Mail-Programm einfach über die OnWork*-Events gemacht. Sollte für alle Indy-Komponenten gehen, da IMHO alles von TIdTCPConnection abgeleitet ist. Bin leider noch nicht ganz zufrieden mit der Lösung, da es immer wieder vor kommt, dass AWorkCountMax in OnWorkBegin 0 ist, obwohl mehrer MB übertragen werden.
Ich nutze Indy 10.2.0.3. Früher war die Signatur mal statt Int64, nen Integer, falls das jemanden wundern sollte.
Delphi-Quelltext
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:
| var AverageSpeed: Extended; BytesToTransfer: Integer; StartTime: TDateTime;
procedure TConnection.OnWork(Sender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); var H, M, Sec, MS: Word; DLTime, DownTime: Double; begin DecodeTime(Now - StartTime, H, M, Sec, MS); Sec := Sec + M * 60 + H * 3600; DLTime := Sec + MS / 1000; if DLTime > 0 then begin AverageSpeed := (AWorkCount) / DLTime; if (BytesToTransfer > 0) then DownTime := (BytesToTransfer-AWorkCount)/AverageSpeed; end;
if AWorkCount > BytesToTransfer then begin BytesToTransfer := AWorkCount; end;
Label1.Caption := IntToStr(AWorkCount)+' Bytes / '+IntToStr(BytesToTransfer)+' Bytes @ '+ FloatToStr(AverageSpeed)+' Bytes/s ~'+FormatFloat('0.00 sek', DownTime)); end;
procedure TConnection.OnWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin if AWorkCountMax > 0 then BytesToTransfer := AWorkCountMax; AverageSpeed := 0; StartTime := Now;
if BytesToTransfer > 0 then begin MsgPanel.SpeedStart('0 / '+ByteToString(BytesToTransfer)+' @ '+ FormatFloat('0.00 KB/s', AverageSpeed), BytesToTransfer) end; end;
procedure TConnection.OnWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin end; |
EDIT:
Die prognostizierte Übertragungsmenge ist in
BytesToTransfer (global) und in
AWorkCount (OnWork) das bisher Übertragene.
Yogu - Fr 04.04.08 21:57
Danke,
meolus. So klappt's! :party:
Ich muss wohl noch etwas an dem Code arbeiten, um ihn an meine Bedürfnisse anzupassen, aber er berechnet sogar gleich die Restzeit richtig! Danke!
Grüße,
Yogu
meolus - Fr 04.04.08 22:13
Das mit der Restzeit habe ich eben erst zurecht gemacht :D
Ursprünglich stammt das Ganze glaube ich aus nem Tipp für die Übertragungsrate von TIdFTP von swissdelphicenter.ch oder so.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!