Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdHTTP Downloadgeschwindigkeit... (https://www.delphipraxis.net/153838-idhttp-downloadgeschwindigkeit.html)

Z4ppy 17. Aug 2010 19:51

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

rollstuhlfahrer 17. Aug 2010 19:58

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

gsh 18. Aug 2010 08:42

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;

Z4ppy 18. Aug 2010 13:30

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:
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;
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 ^^

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...

rollstuhlfahrer 18. Aug 2010 15:18

AW: IdHTTP Downloadgeschwindigkeit...
 
Zitat:

Zitat von Z4ppy (Beitrag 1043054)
Dein Code würde garantiert nicht gehen... Du verwendest AWorkCount im Timer, hast dieses aber nirgends gesetzt ^^

Einspruch: AWorkCount ist ein Parameter der an die Prozedur die mit OnWork verknüpft ist übergeben wird, also existiert er doch!

Zitat:

Zitat von Z4ppy (Beitrag 1043054)
Round(1000*(AWorkCount-FBytes)/(GetTickCount-FTime))

Also das macht ja mal überhaupt keinen Sinn. Du vergleichst die Zeit ab dem Anfang des Downloads mit dem 1000-fachem Downloadvolumen, welches zwischen zwei Aufrufen von IdHTTPWork geladen wurde. Es muss +FBytes heißen. Außerdem musst du dann drunter auch
Delphi-Quellcode:
FBytes:=AWorkCount + FBytes;
schreiben.
Grund: Du willst ja eine mittlere Geschwindigkeit, nicht irgendwas.


Bernhard

Z4ppy 18. Aug 2010 16:23

AW: IdHTTP Downloadgeschwindigkeit...
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1043116)
Zitat:

Zitat von Z4ppy (Beitrag 1043054)
Dein Code würde garantiert nicht gehen... Du verwendest AWorkCount im Timer, hast dieses aber nirgends gesetzt ^^

Einspruch: AWorkCount ist ein Parameter der an die Prozedur die mit OnWork verknüpft ist übergeben wird, also existiert er doch!

Einspruch, er verwendet AWorkCount im OnTimer... Und der Timer übergibt kein AWorkCount ;)

Zitat:

Zitat von rollstuhlfahrer (Beitrag 1043116)
Zitat:

Zitat von Z4ppy (Beitrag 1043054)
Round(1000*(AWorkCount-FBytes)/(GetTickCount-FTime))

Also das macht ja mal überhaupt keinen Sinn. Du vergleichst die Zeit ab dem Anfang des Downloads mit dem 1000-fachem Downloadvolumen, welches zwischen zwei Aufrufen von IdHTTPWork geladen wurde. Es muss +FBytes heißen. Außerdem musst du dann drunter auch
Delphi-Quellcode:
FBytes:=AWorkCount + FBytes;
schreiben.
Grund: Du willst ja eine mittlere Geschwindigkeit, nicht irgendwas.

Falsch, ich möchte die aktuelle Geschwindigkeit, die totale kann ich ausrechnen, ich weiss die totale Grösse und kann ja die Zeit messen von Anfang bis Ende mittels WorkBegin bzw. WorkEnd ^^
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 23:09 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