Results 1 to 10 of 10

Thread: Download Snelheid berekenen

  1. #1

    Download Snelheid berekenen

    Ik gebruik Indy HTTP met de WorkBegin en Work event's om een progress weer te geven. Nu zou ik hier graag bij weergeven op welke snelheid gedownload wordt - heb hier al naar zitten zoeken maar kom er niet echt aan uit hoe ik dat kan berekenen. Iemand die mij op weg kan helpen? Tevens zou ik de resterende tijd willen berekenen

  2. #2
    In WorkBegin() kun je een starttijd zetten. Daarna kun je in Work() de starttijd van de huidige tijd af halen en je hebt dan de verstreken tijd. Je kunt in Work() dan zien (a.d.h.v. AWorkCount) hoeveel werk er al is gedaan.

    Voorbeeldje uit de losse vuist:
    Delphi Code:
    1. //...
    2. public
    3.   TotaalAantalBytes: Integer;
    4.   BeginTijd: Cardinal;
    5.   SnelheidBytesPerSeconden: Extended;
    6. end;
    7. //...
    8.  
    9. procedure TForm1.HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
    10.   const AWorkCountMax: Integer);
    11. begin
    12.   TotaalAantalBytes := AWorkCountMax;
    13.   BeginTijd := GetTickCount();
    14. end;
    15.  
    16. procedure TForm1.HTTPWork(Sender: TObject; AWorkMode: TWorkMode;
    17.   const AWorkCount: Integer);
    18. var
    19.   Verstreken: Extended;
    20. begin
    21.   Verstreken := (GetTickCount() - BeginTijd) / 1000; // seconden
    22.   SnelheidBytesPerSeconden := AWorkCount / Verstreken;
    23. end;

    Het is natuurlijk maar wel de vraag hoe je de snelheid wilt hebben. Bytes per seconden. Megabytes per seconden. Megabits per seconden. etc. etc.

  3. #3
    Dankjewel! Ga ik dat eens proberen - Dat werkt inderdaad perfect!!

    Voor berekenen van resterende download tijd - kan ik dan ook bovenstaand gebruiken? Dus een Begintijd en verstreken tijd daarop de snelheid / totale grootte = aantal resterende seconden?
    Last edited by Reidinga; 20-Nov-18 at 19:07.

  4. #4
    Optimaal zou je de downloadsnelheid moeten berekenen over de laatste seconden (of twee). Want als je de nog resterende tijd gaat berekenen a.d.h.v. de gehele tijd dan kunnen er nog wel eens rare resultaten komen als de snelheid eerst inzakt en daarna weer omhoog gaat.

    Je kunt met gettickcount bijvoorbeeld kijken wanneer deze > 2000 hoger is dan de vorige registratie en indien dat het geval is het verschil tussen dan gedownloade bytes pakken. Als je eenmaal die snelheid hebt kun je daarmee de resterende tijd berekenen en die is dan enigszins betrouwbaar tenzij de download snelheid daarna inzakt of omhoog gaat. Maar de "huidige snelheid" kun je natuurlijk elke weer opnieuw bepalen.

    (Ik zit op mobiel dus kan even geen voorbeeld tikken)
    Last edited by rvk; 20-Nov-18 at 22:00.

  5. #5
    Ik zit weer achter de computer...

    ControleerOverms kun je instellen om de snelheid over de laatste X ms uit te rekenen. Na het bepalen van SecondenNogTeGaan kun je dit op het scherm zetten. Ik weet niet om de hoeveel tijd Work() getriggered wordt. Als dit te vaak gebeurd is het wel verstandig niet iedere keer SecondenNogTeGaan te updaten op het scherm maar om dit alleen elke seconden ofzo te doen.

    Even uit de losse vuist... (zonder te testen)
    Delphi Code:
    1. //...
    2.   public
    3.     { Public declarations }
    4.     TotaalAantalBytes: Integer;
    5.     BeginTijd: Cardinal;
    6.     BeginBytes: Integer;
    7.     SnelheidBytesPerSeconden: Extended;
    8.     SecondenNogTeGaan: Extended;
    9.   end;
    10.  
    11. //...
    12.  
    13. const
    14.   ControleerOverms = 1000; // controleer snelheid over een periode van 1000 ms
    15.  
    16. procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
    17. begin
    18.   TotaalAantalBytes := AWorkCountMax;
    19.   BeginTijd := GetTickCount();
    20.   BeginBytes := 0;
    21. end;
    22.  
    23. procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    24. var
    25.   NuTijd: Cardinal;
    26.   Verlopen: Extended;
    27. begin
    28.  
    29.   NuTijd := GetTickCount();
    30.   if BeginTijd + ControleerOverms < NuTijd then
    31.   begin
    32.     Verlopen := (NuTijd - BeginTijd) / 1000; // verstreken tijd in seconden
    33.     SnelheidBytesPerSeconden := (AWorkCount - BeginBytes) / Verlopen;
    34.     BeginTijd := GetTickCount();
    35.     BeginBytes := AWorkCount;
    36.   end;
    37.  
    38.   SecondenNogTeGaan := (TotaalAantalBytes - AWorkCount) / SnelheidBytesPerSeconden;
    39.   // ergens op het beeld zetten
    40.  
    41. end;

  6. #6
    Dankjewel - ik ga dat zeker eens proberen - wil voor de snelheid ook even een timeout/tickcount gebruiken - omdat de Work behoorlijk vaak (denk meerdere malen per seconde) getriggerd wordt - en daarmee krijg ik nu een flikker op mijn statusbar - vanwege het onnodig vele updaten

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,328
    Naar wat ik mij kan herinneren wordt OnWork iedere X-aantal (buffergrootte?) bytes
    die binnenkomt aangeroepen.
    Wanneer de verbinding dus langzaam is (bijvoorbeeld één of andere wazige server in
    China of bij gewoon een slechte verbinding), dan wordt deze event dus minder vaak
    getriggerd dan wanneer je een snelle verbinding hebt.
    TMemoryLeak.Create(Nil);

  8. #8
    Is het ook mogelijk met idHTTP om de download snelheid te beperken? Sommige servers zijn zeer snel en hierdoor kan ik met 50MB downloaden op een server, maar als veel gebruikers dit tegelijk doen haalt dat een hoop capaciteit van de server. Is het mogelijk om met idHTTP de download snelheid te limiteren tot bv max 5mb?

  9. #9
    Indy has a TIdIOHandlerThrottle component for exactly that purpose.
    It will download the *requested* amount of data, and then Sleep() for a
    period of time before allowing the received data to be returned to the
    calling code that requested it. And it will not redownload anything
    autoamtically, it waits until another requests for data is made by the code.
    Het is dus maar hoe je throttling ziet.

    Andere optie:
    You'll need to create TIdServerIntercept and TIdConnectionIntercept descendants.
    The client intercept will override Send and Receive. The client intercept
    needs to have some way of capturing elapsed time for the IO operation, and
    calculate the bandwidth consumed when sending/receiving its data. Then
    throttle back when it exceeds its maximum.
    The server intercept will create client intercepts to be used for client
    connections to the server. Set the TIdTCPServer.Intercept to this class.
    Zie http://www.delphigroups.info/2/ee/191582.html
    en http://www.delphigroups.info/2/25/182934.html

    Bijvoorbeeld (voorbeeldje voor idFTP die ik gevonden had):
    Delphi Code:
    1. procedure TForm1.IdFTP1DataChannelCreate(ASender: TObject;  ADataChannel:
    2. TIdTCPConnection);
    3. var
    4.   LThrottle: TIdInterceptThrottler;
    5. begin
    6.   LThrottle := TIdInterceptThrottler.Create(ADataChannel);
    7.   ADataChannel.IOHandler.Intercept := LThrottle;
    8.   LThrottle.BitsPerSec := 8192; // 1K
    9. end;
    10.  
    11. procedure TForm1.IdFTP1DataChannelDestroy(ASender: TObject;  ADataChannel:
    12. TIdTCPConnection);
    13. begin
    14.   with ADataChannel.IOHandler do begin
    15.     Intercept.Free;
    16.     Intercept := nil;
    17.   end;
    18. end;


    Maar even afgezien dat... handelt je server dit gewoon niet netjes af als er heel veel aanvragen zijn. Of gaat de server dan gewoon "plat"?

    (we hebben het hier niet over een echte DDOS dus volgens mij moet een server dit toch wel aankunnen)

  10. #10
    Nee het is zeker geen DDoS, maar die server gaat gewoon plat, normaal zou de load balancer hier uitkomst bieden - maar dit gebeurd bij 1 server dus niet, en daar krijg je dus dat een download het hele netwerk kan leegzuigen aan data verbruik..

    Dankjewel, ik wist niet van het bestaan van TIdInterceptThrottler af.. Ik ga die er eens tussen zetten, kijken wat dat geeft

    [Edit]:
    Die throttler werkt zeer goed - kan nu netjes een gemiddelde download snelheid pakken - eventueel pollen op de server hoe druk het is en daarop afstemmen. Maar dit werkt perfect zo! Dankjewel
    Last edited by Reidinga; 22-Nov-18 at 21:40.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •