![]() |
IdHTTP Downloadgeschwindigkeit...
Ich lade eine Datei über IdHTTP (in einem eigenen Thread usw.) herunter und ermittle mittels OnWork die Downloadgeschwindigkeit.
Nun, meine eigentliche Geschwindigkeit beträgt rund 650 kB/s, die Anzeige schwankt aber zwischen 200 kB/s und 1,5 MB/s. Wie kann ich es hinkriegen, dass die Werte nicht so stark schwanken? Ich denke, das Problem ist, dass OnWork zu oft aufgerufen wird und somit mit sehr kleinen Intervallen gerechnet wird. Lässt sich das Aufrufen von OnWork verzögern ohne dass der Download selbst behindert wird? (Ein einfaches Delay am Ende von OnWork funktioniert nicht) MfG Z4ppy |
AW: IdHTTP Downloadgeschwindigkeit...
Du kannst aber die neue Geschwindigkeit mit der alten mitteln. Also etwa 80% der alten Geschwindigkeit + 20% der neu errechneten Geschwindigkeit = 100% der angezeigten Geschwindigkeit. Wenn die Werte allerdings nicht der Realität entsprechen, musst du etwas an den Prozentzahlen drehen.
Bernhard |
AW: IdHTTP Downloadgeschwindigkeit...
So frei aus dem Kopf sollte es auch so gehen (Gut das ich weiß welchen Code du benutzt):
Delphi-Quellcode:
procedure TForm1.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer); begin FBytes := AWorkCount+FBytes; end; // Dann noch ein Timer der sagen wir mal jede Sekunde aufgerufen wird procedure TForm1.OnTimer1(ASender: TObject) begin if not((GetTickCount - FTime) <= 0) then begin try SpeedStatus.caption := Format('%.2f KB/s', [(AWorkCount - FBytes) / (GetTickCount - FTime)]); except end; end; FTime := GetTickCount; FBytes := 0; Application.ProcessMessages; end; |
AW: IdHTTP Downloadgeschwindigkeit...
Ja, so ähnlich habe ich es jetzt auch gelöst, ich habe eine Variable auf false gesetzt, sie wird über einen Timer true gesetzt und wenn sie true ist, dann wird im OnWork der Code für die Anzeige ausgeführt und die Variablen werden neu gesetzt, ansonsten passiert nichts :)
Dein Code würde garantiert nicht gehen... Du verwendest AWorkCount im Timer, hast dieses aber nirgends gesetzt ^^ Hier mein Code:
Delphi-Quellcode:
var RunUpdate:boolean=false;
Delphi-Quellcode:
Natürlich wäre es nicht nötig, die Geschwindigkeit als Variable zu speichern, aber ich benötige sie noch ein paar mal mehr im OnWork und das hier ist nur der zentrale Code für die Geschwindigkeit. So wird diese auch schön in B/s, kB/s, MB/s usw. ausgegeben ^^
procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
var Speed:integer; //Bytes pro sekunde begin if RunUpdate then begin RunUpdate:=false; if (GetTickCount-FTime)>0 then Speed:=Round(1000*(AWorkCount-FBytes)/(GetTickCount-FTime)) else Speed:=0; SpeedStatus.Caption:=GetSizeName(Speed)+'/s'; FTime:=GetTickCount; FBytes:=AWorkCount; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin RunUpdate:=true; end; MfG Z4ppy PS.: Wieso machst du das Format eigentlich in einem try-except-Block? Wenn GetTickCount-FTime>0 gilt, dürften ja keine Probleme auftreten können... |
AW: IdHTTP Downloadgeschwindigkeit...
Zitat:
Zitat:
Delphi-Quellcode:
schreiben.
FBytes:=AWorkCount + FBytes;
Grund: Du willst ja eine mittlere Geschwindigkeit, nicht irgendwas. Bernhard |
AW: IdHTTP Downloadgeschwindigkeit...
Zitat:
Zitat:
Nur war das Problem, dass eben das Interval zwischen den OnWork-Aufrufen zu klein war und da grosse Ungenauigkeiten auftraten und deshalb die Geschwindigkeit so schwankte. Und der Ausdruck macht sehr wohl Sinn, GetTickCount liefert Millisekunden, mit dem Faktor 1000 gibt das dann wieder Bytes pro Sekunde. Ich könnte natürlich auch die Zeit durch 1000 teilen, das kommt aufs Gleiche raus. MfG Z4ppy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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