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.
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.
if it was hard to write, it should be hard to read.