AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)
Thema durchsuchen
Ansicht
Themen-Optionen

IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

Ein Thema von CK_CK · begonnen am 23. Feb 2007 · letzter Beitrag vom 23. Feb 2007
Antwort Antwort
Benutzerbild von CK_CK
CK_CK

Registriert seit: 30. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#1

IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 15:10
Hallo,
wie bereits im Titel zu sehen, würde ich gerne wissen, wie man die Downloadgeschwindigkeit einer TIdFTP-Komponente beschränken kann (z.B. mit max. 200 kb/s downloaden, obwohl 600 möglich wären).

Ich habe auch schon danach gesucht, aber nirgends eine Lösung gefunden. Ist das überhaupt mit Indy möglich?
Wenn nein: Gibt es andere Komponenten, die das können?

Vielen Dank schonmal für eure Antworten ,
Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 15:20
die Komponente selbst bietet es nicht ABER du kannst es erzwingen wenn du den Stream in den geladen wird dazu bringst die Daten nur in einer bestimmten Geschwindigkeit entgegen zu nehmen. Wenn du also beim schreiben in den Stream festgestellt wird das noch gar keine Daten wieder rein dürften weil sonst die Datenrate zu hoch wird wartest du mit dem schreiben bis die Zeit reif ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 30. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 15:26
Hi!
Vielen Dank für die Idee! Wie bringe ich denn den Stream dazu, keine Daten anzunehmen?
Ich verwende IdFtp.Get('Adresse', aSTREAM);. Ich kann doch während die FTP-Komponente in den Stream schreibt nicht auch noch den Stream bearbeiten, oder?

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 16:56
du leitest einfach von deiner Streamklasse ab und überschreibst die Funktion "Write", in der Funktion lässt du eine schleife laufen die solange läuft bis das schreiben wieder erlaubt ist. Wann das schreiben erlaubt ist musst du aus den Datenmengen errechen. Wenn du also 3kb pro Sekunden zulässt und deiner Funktion 6kb übergeben werden darfst du erst nach 2 Sekunden wieder neue Daten zulassen bzw. die Funktion 1 Sekunde blockieren.
Delphi-Quellcode:
procedure TYourStream.Write(const Buffer; Count: Longint): Longint;
begin
  while not(NeueDatenErlaubt()) do
  begin
    //Das Sleep ist geschmackssache
    sleep(10);
  end;
  inherited;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 30. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 18:22
Ich hab' das so mal probiert, aber irgendwie funktioniert es nicht.
Ich bekomme immer eine AV "Ungültige Gleitkommaoperation"...

Mein Code sieht so aus:
Delphi-Quellcode:
type
  TSpeedLimitedStream = class(TFileStream)
  private
    fMaxSpeed: Cardinal;
    fLastTick: Cardinal;
    fLastCount: Integer;

    function NewDataAllowed(Count: Integer): Boolean;
  public
    function Write(const Buffer; Count: Longint): Longint; override;

    property MaxSpeed: Cardinal read fMaxSpeed write fMaxSpeed default 0;
  end;
Implementiert habe ich die Methoden so:
Delphi-Quellcode:
function TSpeedLimitedStream.NewDataAllowed(Count: Integer): Boolean;
var
  curTick: Cardinal;
  curCount: Integer;
begin
  if fMaxSpeed = 0 then
  begin
    Result := True;
  end else begin
    curTick := GetTickCount;
    curCount := Count;

    if (curCount-fLastCount)/((curTick-fLastTick)/1000) <= fMaxSpeed then
      Result := False
    else
      Result := True;

    fLastTick := GetTickCount;
    fLastCount := Count;
  end;
end;

function TSpeedLimitedStream.Write(const Buffer; Count: Integer): Longint;
begin
  while not NewDataAllowed(Count) do
    Sleep(10);

  inherited Write(Buffer, Count);
end;
Ich benutze diesen Stream ganz normal für's downloaden, also IdFTP.Get('Dateiname', MyStream);, wobei MyStream vom Typ TSpeedLimitedStream ist und MaxSpeed auf 50 gesetzt ist...

Erkennt jemand daran einen Fehler?

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 30. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 19:37
Da war ein ganz großer Denkfehler drinnen...

Für alle, die auch mal sowas machen wollen kommt hier der berichtigte Code:
Interface:
Delphi-Quellcode:
type
  TSpeedLimitedStream = class(TFileStream)
  private
    fMaxSpeed: Cardinal;
    fLastTick: Cardinal;

    function NewDataAllowed(Count: Longint): Boolean;
  public
    function Write(const Buffer; Count: Longint): Longint; override;

    property MaxSpeed: Cardinal read fMaxSpeed write fMaxSpeed default 0;
  end;
Implementation:
Delphi-Quellcode:
function TSpeedLimitedStream.NewDataAllowed(Count: Integer): Boolean;
var
  tmp: Cardinal;
begin
  tmp := GetTickCount-fLastTick;
  if tmp = 0 then tmp := 1;
  Result := Count/tmp <= fMaxSpeed;
end;

function TSpeedLimitedStream.Write(const Buffer; Count: Longint): Longint;
begin
  if fMaxSpeed > 0 then
    while not NewDataAllowed(Count) do
      Sleep(1);
  fLastTick := GetTickCount;

  Result := inherited Write(Buffer, Count);
end;
So funktioniert das perfekt! Vielen Dank nochmal an SirThornberry!

Einen schönen Abend noch,
Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: IdFTP -> Downloadgeschwindigkeit begrenzen (Indy 10)

  Alt 23. Feb 2007, 19:39
Schön zu wissen das meine theoretichen Gedanken praktich funktioneren, hab nie die zeit gefunden das auch mal zu probieren - danke
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 23:58 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