Autor Beitrag
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 04.04.08 17:24 
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
Hält's aus hier
Beiträge: 9


Delphi 2007 WIN 32 und Lazarus 0.9.25
BeitragVerfasst: Fr 04.04.08 17:29 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
progressbar.min:=0;
 try
 //Anwendung
 finally
 progressbar.position:=100;

_________________
mfg Sebastian
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 04.04.08 20:22 
user profile iconSTS301 hat folgendes geschrieben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

Gentoo, Debian, Win7 64-bit, WinXP
Delphi 2006 Prof., Delphi 2005 PE
BeitragVerfasst: 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.



ausblenden volle Höhe 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.

_________________
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

Gentoo, Debian, Win7 64-bit, WinXP
Delphi 2006 Prof., Delphi 2005 PE
BeitragVerfasst: 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.

_________________
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.