Buenos días, siguiendo un ejemplo de downloader de Neftali me he creado esta unidad de descarga
Código Delphi
[-]
unit UnitDownload;
interface
uses
Dialogs,SysUtils,Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,DateUtils;
type
TIdHTTPThread = class(TThread) private
FURL: AnsiString; FFilename: AnsiString; velocidad,transferencia,tiempo,size,porcentaje: string; posProgress,maxProgress : Int64; Proxyport: Int64; ProxyServer:AnsiString;
IdHTTP: TIdHTTP; ProxySI : Boolean; threadterminado : Boolean; parar : Boolean; TID : Integer; procedure OnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
procedure OnWorkBegin(Sender: TObject; AWorkMode: TWorkMode;const AWorkCountMax: Integer);
procedure OnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure cancel;
procedure Updatelabel;
procedure UpdaProgressbar;
procedure FinThread;
procedure IniThread;
procedure EndNotify;
public
constructor Create(sFUrl : AnsiString; destino : AnsiString; Proxy :Boolean; sProxyport : Int64; sProxyserver:AnsiString ; sTID:Integer);
Destructor Destroy; override;
property terminado :Boolean read Threadterminado write Threadterminado;
property parate : Boolean read parar write parar;
protected
procedure Execute; override;
end;
implementation
uses Unit1;
constructor TIdHTTPThread.Create(sFUrl : AnsiString; destino : AnsiString; Proxy :Boolean; sProxyport : Int64; sProxyserver:AnsiString ; sTID:integer);
begin
inherited Create(false);
FreeOnTerminate := True;
FURL :=sFUrl;
FFilename:=destino;
ProxySI:=Proxy;
Proxyport:=sProxyport;
ProxyServer:=sProxyserver;
TID:=sTID
end;
destructor TIdHTTPThread.Destroy;
begin
IdHTTP.Free;
inherited;
end;
procedure TIdHTTPThread.cancel;
begin
if (IdHTTP.Connected) and (parar = True) then
IdHTTP.Disconnect;
end;
procedure TIdHTTPThread.Execute;
var
fs: TFileStream;
idHTTP : TidHttp;
begin
Synchronize(IniThread);
idHttp:= Tidhttp.create(nil);
if ProxySI = true then
begin
IdHTTP.ProxyParams.ProxyServer:=ProxyServer;
IdHTTP.ProxyParams.ProxyPort:=Proxyport;
end;
idHTTP.HandleRedirects := True;
idHTTP.ReadTimeout := 30000;
IdHTTP.ProtocolVersion:= pv1_0;
idHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)';
IdHTTP.OnWork := Onwork;
IdHTTP.OnWorkBegin:=OnWorkBegin;
IdHTTP.OnWorKEnd:=OnWorkEnd;
fs := TFileStream.Create(FFilename, fmCreate);
try
IdHTTP.Get(FUrl, fs);
finally
fs.Free;
Synchronize(EndNotify);
end;
end;
procedure TIdHTTPThread.OnWorkBegin(Sender: TObject; AWorkMode: TWorkMode;const AWorkCountMax: Integer);
begin
posProgress:= 0;
if AWorkMode = wmRead then begin
maxProgress := AWorkCountMax;
posProgress := 0; end;
if AWorkMode = wmRead then begin
velocidad := 'Descarga: 0 Kb/s ';
FStartDate := Now; end;
Synchronize(Updatelabel);
Synchronize(Updaprogressbar);
end;
procedure TIdHTTPThread.OnWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
var
ElapsedTime : Cardinal;
n1,n2 : double;
begin
if AWorkMode=wmRead then begin
posProgress := AWorkCount + 40;
size := Format(' %s Mb',[FormatFloat('0.00',(maxProgress)/1024000)]);
ElapsedTime := SecondsBetween(Now,FStartDate); if ElapsedTime>0 then
begin
velocidad := Format('Descarga: %s Kb/s',[FormatFloat('0.00',(AWorkCount/1024)/ElapsedTime)]);
n1:= (AWorkCount/1024000);
n2:= (maxProgress/1024000);
transferencia:= Format('Descargado: %s Mb ',[FormatFloat('0.00',(AWorkCount/1024000))])+Format('De: %s Mb',[FormatFloat('0.00',(maxProgress)/1024000)]);;
porcentaje:=Format('Porcentaje: %s',[FormatFloat('0',((AWorkCount*100)/maxprogress))])+'%';
tiempo:=Format('Tiempo Restante %s ',[FormatDateTime('tt',((n2-n1)*elapsedtime))]);
end;
end;
Synchronize(Updatelabel);
Synchronize(Updaprogressbar);
end;
procedure TIdHTTPThread.OnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
maxProgress := 0;
transferencia:='Descargando:';
velocidad:='Descarga:';
Synchronize(Updatelabel);
Synchronize(Updaprogressbar);
end;
procedure TIdHTTPThread.Updatelabel;
begin
Form1.UpdateLabel(velocidad,transferencia,tiempo,size,porcentaje);
end;
procedure TIdHTTPThread.UpdaProgressbar;
begin
Form1.UpdateProgressbar(posProgress,maxProgress);
end;
procedure TIdHTTPThread.FinThread ;
begin
form1.finthread:=True;
end;
procedure TIdHTTPThread.IniThread ;
begin
form1.finthread:=false;
end;
procedure TIdHTTPThread.EndNotify;
begin
Form1.eventhreadterminate(TID);
end;
end.
seguramente se podrá mejorar.
El problema es que esto me funciona cuando tengo un solo thread, pero como haria por ejemplo que es lo que quiero hacer para mandar los datos de descarga con un progressbar a un listview y en multithread. O sea un Multidownloader con listview y progressbar al estilo del Jdonwloader.