AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi [indy]Verbleibende Zeit eines Downlods anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

[indy]Verbleibende Zeit eines Downlods anzeigen

Ein Thema von IceTube · begonnen am 21. Jun 2008 · letzter Beitrag vom 6. Jul 2008
Antwort Antwort
IceTube
(Gast)

n/a Beiträge
 
#1

[indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 21. Jun 2008, 18:13
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
  Mit Zitat antworten Zitat
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 5. Jul 2008, 16:50
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
Takeo
  Mit Zitat antworten Zitat
IceTube
(Gast)

n/a Beiträge
 
#3

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 5. Jul 2008, 17:23
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 5. Jul 2008, 17:27
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
IceTube
(Gast)

n/a Beiträge
 
#5

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 5. Jul 2008, 17:36
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
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
  Mit Zitat antworten Zitat
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 5. Jul 2008, 17:49
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
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!
Takeo
  Mit Zitat antworten Zitat
IceTube
(Gast)

n/a Beiträge
 
#7

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 6. Jul 2008, 16:31
Zitat von Novo:
Prozent
Percent := (100 * aWorkCount) div aWorkCountMax //Prozent
Zitat von Novo:
Restzeit
Bekomme ich leider nicht besser hin!

Zitat von Novo:
DownloadSpeed
Siehe: http://www.delphi-treff.de/tipps/net...rnet/tipp/329/

Zitat von Novo:
Ausserdem kommt bei...erstmal Gleitkommadivision durch Null!
Muss man mit try-except abfangen

Zitat von Novo:
Bei deinem "überarbeiteten" code komtm jetzt bei Speed z.B. 130,87455757619756 kb/s raus!
Runden kannst du mit Round(Speed) í
Besser bekomme ich die Verbleibende Zeit anzeige nicht hin...
lg
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 6. Jul 2008, 17:57
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: [indy]Verbleibende Zeit eines Downlods anzeigen

  Alt 6. Jul 2008, 17:59
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz