AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke IdHTTP Downloadgeschwindigkeit...
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTP Downloadgeschwindigkeit...

Ein Thema von Z4ppy · begonnen am 17. Aug 2010 · letzter Beitrag vom 18. Aug 2010
Antwort Antwort
Z4ppy

Registriert seit: 25. Apr 2008
269 Beiträge
 
Delphi 7 Enterprise
 
#1

IdHTTP Downloadgeschwindigkeit...

  Alt 17. Aug 2010, 19:51
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

Geändert von Z4ppy (17. Aug 2010 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: IdHTTP Downloadgeschwindigkeit...

  Alt 17. Aug 2010, 19:58
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

AW: IdHTTP Downloadgeschwindigkeit...

  Alt 18. Aug 2010, 08:42
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;
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Z4ppy

Registriert seit: 25. Apr 2008
269 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: IdHTTP Downloadgeschwindigkeit...

  Alt 18. Aug 2010, 13:30
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:
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...

Geändert von Z4ppy (18. Aug 2010 um 14:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#5

AW: IdHTTP Downloadgeschwindigkeit...

  Alt 18. Aug 2010, 15:18
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!

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 FBytes:=AWorkCount + FBytes; schreiben.
Grund: Du willst ja eine mittlere Geschwindigkeit, nicht irgendwas.


Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Z4ppy

Registriert seit: 25. Apr 2008
269 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: IdHTTP Downloadgeschwindigkeit...

  Alt 18. Aug 2010, 16:23
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

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 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
  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 12:12 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