Thema: Delphi IdHTTP zu schnell?

Einzelnen Beitrag anzeigen

Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: IdHTTP zu schnell?

  Alt 21. Apr 2006, 13:07
Haha

ich habe mich tatsächlich mal dran gesetzt und eine Klasse geschrieben welche mehrere IdHTTPs parallel downloaden lässt.
und es geht auch deutlich schneller (bilde ich mir zumindest ein ).

hier mein Code

Delphi-Quellcode:
unit UDownloader;

interface

uses IdHTTP, ExtCtrls, SysUtils, Windows;

type
  THTTPArray = array of TIdHTTP;
  TDownloader = class(TObject)
  private
    FHTTPs: THTTPArray; //Clients
    LastCall: Int64; //Last Use of Get
    FTimer: TTimer; //Timer to Clear Idle Clients
    function Add: Integer;
    procedure Clear;
    procedure ClearIdle;
    function GetIdle: Integer;
    procedure OnTimer(Sender: TObject);
  public
    constructor Create;
    destructor Destroy;
    function Get(URL: String): String;
  end;

implementation

constructor TDownloader.Create;
begin
  inherited;
  Clear;
  FTimer:=TTimer.Create(nil);
  FTimer.Interval:=5*60*1000; //5 minutes
  FTimer.OnTimer:=OnTimer;
  FTimer.Enabled:=True;
end;

destructor TDownloader.Destroy;
var i:Integer;
begin
  Clear;
  FTimer.Free;
  inherited;
end;

function TDownloader.Add: Integer;
//Add new Client, Return ID
begin
  Result:=Length(FHTTPs); //ID of new Client
  SetLength(FHTTPs,Result+1);
  FHTTPs[Result]:=TIdHTTP.Create;
  FHTTPs[Result].Tag:=0; //Not in use
  FHTTPs[Result].HandleRedirects:=True;
end;

procedure TDownloader.Clear;
//Clear alls Clients and set Array to 0
var i:Integer;
begin
  for i:=0 to Length(FHTTPs)-1 do
    FHTTPs[i].Free;
  SetLength(FHTTPs,0);
end;

procedure TDownloader.ClearIdle;
//Clear all Clients which are Idle, beginning from the back
var i:Integer;
begin
  for i:=Length(FHTTPs)-1 downto 0 do
    if FHTTPs[i].Tag=0 then
      begin
      FHTTPs[i].Free;
      SetLength(FHTTPs,i);
      end;
end;

function TDownloader.GetIdle: Integer;
//Get first idle Client
var i: Integer;
begin
  Result:=-1;
  for i:=0 to Length(FHTTPs)-1 do
    if FHTTPs[i].Tag=0 then
      begin
      Result:=i;
      Break;
      end;
end;

procedure TDownloader.OnTimer(Sender: TObject);
//Timer Event to clear idle Clients
begin
  if (GetTickCount-LastCall)>30*1000 then ClearIdle;
end;

function TDownloader.Get(URL: String): String;
//Download
var I: Integer;
begin
  LastCall:=GetTickCount;
  I:=GetIdle; //Get Idle
  if i=-1 then I:=Add; //If no idles, create new
  FHTTPs[i].Tag:=1; //client is in use
  Result:=FHTTPs[i].Get(URL); //download
  FHTTPs[i].Tag:=0; //client is no more in use
  LastCall:=GetTickCount;
end;

end.
Scheint eigentlich ganz gut zu funktionieren...irgendwelche verbesserungsvorschläge?


Edit:
es scheint aber irgendwie probleme zu geben wenn man auf nen link klickt bevor ganz geladen ist...kann das sein?
Zudem kommt, wenn ich über den Proxy diesen Beitrag hier zB editieren will "Kein Eintrags-Modus ausgewählt"...
Was heisst das?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat