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
 //Anwendung
 finally
 progressbar.position:=100;


Yogu - Fr 04.04.08 20:22

user profile iconSTS301 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
progressbar.min:=0;
 try
 //Anwendung
 finally
 progressbar.position:=100;

Danke für die Schnelle Antwort, user profile iconSTS301. :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
  //Errechnen der Transfergeschwindigkeit:
  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 //Workaround falls BytesToTransfer = 0
    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;
  //sonst ist BytesToTransfer = 0, also Übertragungsmenge unbekannt!
end;


procedure TConnection.OnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  //Übertragung beendet
end;



EDIT:

Die prognostizierte Übertragungsmenge ist in BytesToTransfer (global) und in AWorkCount (OnWork) das bisher Übertragene.


Yogu - Fr 04.04.08 21:57

Danke, user profile iconmeolus. 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.