Entwickler-Ecke

Internet / Netzwerk - restliche Downloadzeit


hibbert - Di 18.04.06 20:02
Titel: restliche Downloadzeit
Hi,
ich habe die suchefunktion gefunden und habe sie sogar benutzt :shock: aber leider vbin ich trotzdem zu keinem Ergebnis gekommen :cry:

Ich benutze folgenden Code um eine Datei aus dem Internet zu laden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure dload(fname:string);
var responseStream: TFileStream;
begin
  form1.IdHTTP1.Request.Username:=daten.user;
  form1.IdHTTP1.Request.Password:=daten.pwd;
  responseStream := TFileStream.Create(ziel+'\'+fname, fmCreate);
  form1.IdHTTP1.Get(url+'/'+fname, responseStream);
  responseStream.free;
end;


Wie kann ich nun die Zeit ermitteln die noch benötigt wird, bis die datei vollständig geladen wurde?

thx hibbert


Hansi@OMG - Mi 19.04.06 12:41

Also, du hast bei der idhttp die Events OnWorkbegin und OnWork, damit kann man z.B. so arbeiten:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  bitesdown, bitestoget : integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
 bitestoget:=AWorkCountMax;
 gauge1.MaxValue:=bitestoget;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  bitesdown :=AWorkCount;
  gauge1.Progress:=bitesdown;
end;


Du kannst es dir auch in Prozent ausrechnen, aber die Gauge macht das ja selbst.


hibbert - Mi 19.04.06 16:12

Hi,
die Prozent habe ich ja schon. Ich habe nur keine Ahnung, wie ich die restliche Zeit ermitteln soll.

Die Prozent ermittel ich so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
progressbar1.Max:=aworkcountmax;
end;

{...}

procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
  var idx:integer;
begin
progressbar1.Position:=aworkcount;
label8.Caption:=inttostr(round(aworkcount / progressbar1.Max * 100))+' %';
end;


Wie kann ich nun noch die restliche Zeit ermitteln?

thx hibbert


matze - Mi 19.04.06 16:47

du musst dir den zeitpunkt merken, an dem du den Dwonload begonnen hast. Dann kannst du ja ermitteln, wie lange du schon bisher gebruahct hast. Daraus kannst du ermitteln wie lange du durchschnittlich pro Prozent oder Byte (oder was auch immer) gebraucht hast. Und wenn du diesen Wert hast dann aknnst du den auf die 100% oder gesamt-Byte hochrechnen und hast damit die Gesamtzeit.


F34r0fTh3D4rk - Mi 19.04.06 17:26

und das machst du dann in der work prozedur, dann wird immer das genauste, bzw naheste ergebnis ausgegeben, bzw das aktuellste


hibbert - Mi 19.04.06 19:55

Hi,
ich habe es jetzt so gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var lastbytes:integer = 0;
{...}
procedure TForm1.Timer1Timer(Sender: TObject);
var diff,toload:integer;
begin
diff:=progressbar2.Position-lastbytes;
toload:=progressbar2.Max-progressbar2.Position;

if (toload > 0and (diff >0then
label10.Caption:= inttostr(toload div diff);
lastbytes:=progressbar2.Position;
end;

Der Timer hat ein interval von 1000 so bekomme ich die restlichen Sekunden raus.
Das Problem nur: Die Werte springen.
Teilweise habe ich einen Wert von 19 Sekunden, plötzlich ist der Wert bei 45 und kurz darauf wieder bei 15.

Naja ich werde mir da noch was ausdenken, oder hat jemand ne bessere Lösung?

Achso bevor ich es wieder vergesse zu fragen: Wie kann ich das ganze in das schöne Format 00:00:00 bringen?

thx hibbert


matze - Mi 19.04.06 21:23

so kompliziert musst du es gar nicht machen.
Speicher dir doch die Startzeit indem du GettickCountnimmst. Diese Funktion gibt dir die bisherige laufzeit des Computers in Millisekunden wieder.
Du nimmst also eine globale Variable var startzeit: DWORD;
Ich habe jetzt hier mal einen früheren Code von mir auf deine Bedürfnisse umgebaut:

Delphi-Quelltext
1:
(gettickcount-startzeit) div (AWorkCount+1)*(progressbar1.max-AWorkCount)                    


Und dann als Zuckerl noch obendrauf: Eine Funktion die dirMillisekunden in ein schönes Format umwenadelt:

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:
function maketime (ticks:integer): String;
const
  DAYS : Integer = 1000 * 60 * 60 * 24;
  HOURS : Integer = 1000 * 60 * 60;
  MINUTES : Integer = 1000 * 60;
  SECONDS : Integer = 1000;
var
  day, hour, min, sec : Integer;
begin
 day := Ticks div DAYS; //Tage
 dec(Ticks, day * DAYS);

 hour := Ticks div HOURS; //Stunden
 dec(Ticks, hour * HOURS);

 min := Ticks div MINUTES; //Minuten
 dec(Ticks, min * MINUTES);

 sec := Ticks div SECONDS; //Sekunden

 Result := IntToStr(day)+' Tage '+
           IntToStr(hour)+' Stunden '+
           IntToStr(min)+' Minuten '+
           IntToStr(sec)+' Sekunden ';
end;


hibbert - Mi 19.04.06 22:01

Hi,
danke für deine Hilfe, gibt da leider nur n kleines problem bei: zeit:=(gettickcount-startzeit) div (AWorkCount+1)*(progressbar1.max-AWorkCount)
zeit ist immer gleich 0 :(


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
  var aktzeit,restzeit:DWORD;
begin
if preload = true then exit;
aktzeit:=gettickcount;
restzeit:=(aktzeit-startzeit) * (AWorkCount+1div (progressbar1.max-AWorkCount);
label8.Caption:=maketime(restzeit)+'  '+inttostr(round(aworkcount / progressbar1.Max * 100))+' %';
progressbar1.Position:=aworkcount;
startzeit:=gettickcount;
application.ProcessMessages;
end;
{...}
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
startzeit:=gettickcount;
progressbar1.Max:=aworkcountmax;
end;


kurze aber dafür klare Frage: warum?

der hibbert