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 > 0) and (diff >0) then 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; dec(Ticks, day * DAYS);
hour := Ticks div HOURS; dec(Ticks, hour * HOURS);
min := Ticks div MINUTES; dec(Ticks, min * MINUTES);
sec := Ticks div SECONDS; 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+1) div (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
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!