![]() |
[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:
So, ich hoffe das hilft einigen!//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; Ps.: Ein paar Feedbacks wären schön! lg |
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 |
Re: [indy]Verbleibende Zeit eines Downlods anzeigen
Ich weiß, das stört mich auch...
Zitat:
Wenn ich eine Lösung gefunden habe, werde ich diese einbauen im Code lg |
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.
|
Re: [indy]Verbleibende Zeit eines Downlods anzeigen
Zitat:
Hab in dem neuen Code das korrigiert! Ich hab die Lösung jetzt gefunden...
Delphi-Quellcode:
lg
//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; |
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:
erstmal Gleitkommadivision durch Null!
speed := (AWorkCount - FBytes) / (GetTickCount - FTime);
EDIT2: Bei deinem "überarbeiteten" code komtm jetzt bei Speed z.B. 130,87455757619756 kb/s raus! |
Re: [indy]Verbleibende Zeit eines Downlods anzeigen
Zitat:
Delphi-Quellcode:
Percent := (100 * aWorkCount) div aWorkCountMax //Prozent
Zitat:
Zitat:
![]() Zitat:
Zitat:
Delphi-Quellcode:
í
Round(Speed)
Besser bekomme ich die Verbleibende Zeit anzeige nicht hin... lg |
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.
|
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:
In der Zeile (*) passiert das Entscheidende:
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; 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