Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [indy]Verbleibende Zeit eines Downlods anzeigen (https://www.delphipraxis.net/116006-%5Bindy%5Dverbleibende-zeit-eines-downlods-anzeigen.html)

IceTube 21. Jun 2008 17:13


[indy]Verbleibende Zeit eines Downlods anzeigen
 
Hallo!

Ich hab gesucht und gesucht, jedoch bin ich nicht fündig geworden(zumindest nich hier im Forum), nämlich die Dauer eines Downloads anzuzeigen.

Also habe ich mir gedacht, schau ma mal ob ich das (mehr oder weniger) selber hinbekomme. Nun zu meinen Ergebnis :)

Im großen und ganzen funktioniert es, und hier der Code:

Delphi-Quellcode:

//Variablen
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
FBytes,FTime : real;
Max : real;
end;

procedure TForm1.httpWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
var speed,R : real;
min,sec : real;
begin
Application.ProcessMessages;

//Berechne Speed
if not((GetTickCount - FTime) <= 0) then begin
speed := strToFloat(Format('%.2f', [(AWorkCount - FBytes) / (GetTickCount - FTime)]));
end;

//Verbleibende Zeit
if(speed > 0) then begin
//
try
//Versuche die (Gesamtgröße - aWorkCount) durch die Geschwindigkeit zu dividieren
R := Round((Max-aWorkCount)/speed);
except
end;
//
try
//Sekunden berechnen - wieso es durch 1000 geht, weiß ich nicht so genau ...
Sec := Round(R / 1000);

//Minuten - natürlich Sekunden durch 60 dividieren
Min := Round(Sec / 60);
Sec := Sec - (Min*60);

//Kontrolle der Werte
if Sec < 0 then Sec := Sec *(-1);
if Min < 0 then Min := 0;
except
end;

//Ausgeben
xZeit.Caption := floatToStr(Min)+':'+floatToStr(Sec);

end;

//Werte erfassen
FTime := GetTickCount;
FBytes := aWorkCount;
end;

procedure TForm1.httpWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
//Gesamtgröße
Max := AWorkCountMax;

//Werte erfassen
FTime := GetTickCount;
FBytes := 0;
end;
So, ich hoffe das hilft einigen!

Ps.:
Ein paar Feedbacks wären schön!

lg

Novo 5. Jul 2008 15:50

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Sieht ja mal ganz Nett aus, aber irgendwie aktualisiert sich die Anzeige alle 2-4 Sekunden
und schwankt ziemlich stark Bei der Datei...
Einmal ist es 0:4 dann 2:6 usw...


Bzw. der Speed spinnt!
ich habe eine Rapidshare.co mDownloader gecoded, max. Speed dürfte nicht über 60 kb/s gehen (Limit von RS)
Doch spintn die Anzeige mal auf 200 dann auf 2000
usw.

Kann man da noch was verbessern?


EDIT:
So habe ich es bisher:

Delphi-Quellcode:

mom

IceTube 5. Jul 2008 16:23

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Ich weiß, das stört mich auch...

Zitat:

Kann man da noch was verbessern?
Denke schon, nur bin ich noch nicht dahinter gekommen wie ich das lösen kann!?!

Wenn ich eine Lösung gefunden habe, werde ich diese einbauen im Code

lg

Apollonius 5. Jul 2008 16:27

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
StrToFloat zusammen mit Format solltest du dir abgewöhnen - ich sehe auch keinen Sinn darin. Und entferne diese ganzen Try-Except-Blöcke. Du solltest Exceptions vermeiden, nicht schlucken.

IceTube 5. Jul 2008 16:36

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Zitat:

Zitat von Apollonius
StrToFloat zusammen mit Format solltest du dir abgewöhnen - ich sehe auch keinen Sinn darin. Und entferne diese ganzen Try-Except-Blöcke. Du solltest Exceptions vermeiden, nicht schlucken.

Stimmt eigentlich :gruebel:
Hab in dem neuen Code das korrigiert!

Ich hab die Lösung jetzt gefunden...

Delphi-Quellcode:
//Variablen
private
{ Private-Deklarationen } 
public
{ Public-Deklarationen } 
FBytes,FTime : real;
Max : real;
end;

procedure TForm1.httpWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
var speed,R : real;
min,sec : real;
begin
Application.ProcessMessages;

//Berechne Speed
if not((GetTickCount - FTime) >= 1000) then begin
speed := (AWorkCount - FBytes) / (GetTickCount - FTime);

//Werte erfassen
FTime := GetTickCount;
FBytes := 0;
end;

//Verbleibende Zeit
if(speed > 0) then begin
// 
try
//Versuche die (Gesamtgröße - aWorkCount) durch die Geschwindigkeit zu dividieren
R := Round((Max-aWorkCount)/speed);
except
end;
// 
try
//Sekunden berechnen - wieso es durch 1000 geht, weiß ich nicht so genau ...
Sec := Round(R / 1000);

//Minuten - natürlich Sekunden durch 60 dividieren
Min := Round(Sec / 60);
Sec := Sec - (Min*60);

//Kontrolle der Werte
if Sec < 0 then Sec := Sec *(-1);
if Min < 0 then Min := 0;
except
end;

//Ausgeben
xZeit.Caption := floatToStr(Min)+':'+floatToStr(Sec);

end;

//Werte erfassen
FTime := GetTickCount;
FBytes := aWorkCount;
end;

procedure TForm1.httpWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
//Gesamtgröße
Max := AWorkCountMax;

//Werte erfassen
FTime := GetTickCount;
FBytes := 0;
end;
lg

Novo 5. Jul 2008 16:49

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Es würde mich ganz arg freuen, wenn jemand das richtig Zeigen würde, mit Prozent, Restzeit, DownloadSpeed usw.
Weil wenn bei mir Prozentanzeige geht, dann geht Downloadspeed nicht mehr, und wenn ich DownloadSpeed fixxe, geht RestzeitAnzeige nicht mehr wegen Typenumwandlung etc.
Weil % Anzeige geht ja mit integer, realm,, double USW...


wär wahnsinnig nett!


EDIT:
Ausserdem kommt bei
Delphi-Quellcode:
speed := (AWorkCount - FBytes) / (GetTickCount - FTime);
erstmal Gleitkommadivision durch Null!


EDIT2:
Bei deinem "überarbeiteten" code komtm jetzt bei Speed z.B. 130,87455757619756 kb/s raus!

IceTube 6. Jul 2008 15:31

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Zitat:

Zitat von Novo
Prozent

Delphi-Quellcode:
Percent := (100 * aWorkCount) div aWorkCountMax //Prozent
Zitat:

Zitat von Novo
Restzeit

Bekomme ich leider nicht besser hin! :wall:

Zitat:

Zitat von Novo
DownloadSpeed

Siehe: http://www.delphi-treff.de/tipps/net...rnet/tipp/329/

Zitat:

Zitat von Novo
Ausserdem kommt bei...erstmal Gleitkommadivision durch Null!

Muss man mit try-except abfangen

Zitat:

Zitat von Novo
Bei deinem "überarbeiteten" code komtm jetzt bei Speed z.B. 130,87455757619756 kb/s raus!

Runden kannst du mit
Delphi-Quellcode:
Round(Speed)
í
Besser bekomme ich die Verbleibende Zeit anzeige nicht hin...
lg

Apollonius 6. Jul 2008 16:57

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Ich habe bereits darauf hingewiesen, dass man Exceptions vermeiden und nicht schlucken soll. Der Fall einer Division durch Null lässt sich hier doch einfach abfangen.

sx2008 6. Jul 2008 16:59

Re: [indy]Verbleibende Zeit eines Downlods anzeigen
 
Um das Springen der Zeit (oder anderer Werte) zu glätten, gibt es folgende Möglichkeit:
Delphi-Quellcode:
TForm1 = class(TForm)
private
  Wert_alt : double;
  faktor : double; // wird in OnCreate mit 0.2 belegt (darf zwischen 0 und 1 liegen)
public
  ...
end;

procedure TForm1.Berechnung;
var
   Wert_akt : double;
begin
   Wert_akt := ...... ; // deine ermittelte Restzeit

   Wert_akt := faktor * Wert_akt + (1-faktor) * Wert_alt; //(*)
   Wert_alt := Wert_akt;
In der Zeile (*) passiert das Entscheidende:
Der aktuelle Wert wird mit 20% und die gesamte Vergangenheit mit 80% gewichtet.
Im Prinzip ist das ein Digitalfilter (Tiefpass).
Verkleinert man den Faktor, verstärkt sich die Filterwirkung (man darf faktor aber nicht auf 0 setzen, sonst geht nichts mehr)
Vergrössert man den Faktor bis auf 1, ist der Filter ausser Kraft gesetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz