Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 18.04.06 20:02 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 304

Vista
Delphi 2006 Prof., Lazarus
BeitragVerfasst: Mi 19.04.06 12:41 
Also, du hast bei der idhttp die Events OnWorkbegin und OnWork, damit kann man z.B. so arbeiten:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Mi 19.04.06 19:55 
Hi,
ich habe es jetzt so gemacht:
ausblenden 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

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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;

_________________
In the beginning was the word.
And the word was content-type: text/plain.
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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 :(

ausblenden 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

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej