| Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 18.04.06 20:02
Hi,
ich habe die suchefunktion gefunden und habe sie sogar benutzt  aber leider vbin ich trotzdem zu keinem Ergebnis gekommen
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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Hansi@OMG
      
Beiträge: 304
Vista
Delphi 2006 Prof., Lazarus
|
Verfasst: 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.
_________________ Who doesn't know the Micrsoft developer "Mahatma Fatal Error"?
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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; |
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|