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?