Ciao ragazzi, vorrei nuovamente chiedere il vostro aiuto .
Allora un una form in cui ho usato una grid, per l'esattezza la grid è quella dei componenti LMD.
In questa grid ogni riga contiente un indirizzo di un file da scaricare da internet.
come colonna ho inserito una progressbar, perche volevo che si vedesse la progressione del download.
In pratica l'idea era:
giro la grid, per ogni riga lancio il download e faccio partire la progressbar che indico lo stato di avanzamento del download.
da inizio ho messo tutto in un semplice ciclo e con il componente idhttp con gli eventi IdHTTP1Work e IdHTTP1WorkBegin settavo la progressbar.
pero' poi ho visto che quando comincia a scaricare, finche nn ha finito risulta tutto bloccato
cosi' ho pensato di lanciare il download in un thread a parte.
quindi:
giro la lista, per ogni riga lancio un thread che si occupa del download.
Ora ho due problemi:
1) prima scorre la lista e dopo lancia tutti i thread insieme, non riesco a capire perchè.ho messo nel execute del thread uno sleep a 1 secondo... immaginado quindi che parte la prima riga con la prima progress, dopo un secondo parte la seconda riga con l seconda progress ecc..invece no... prima scorre tutta la lista e dopo mi lancia tutti i thread.. cosi tutte le progress partono nello stesso tempo..
2) cosi per ora faccio una riga alla volta usando un solo thread (perlomeno cosi non si blocca tutto in attesa del completamento del download.
pero' non riesco ad accedere alla colonna progressbar dentro la grid da dentro al thread.
vi giro un pezzo del codice;
procedure TMainForm.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
// riga 2 per provare se mostra la progressione della barra, ma non funziona
GridPatch.Cells[progressbar.position,2].position:=int(aworkcount);
end;
procedure TMainForm.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
GridPatch.Cells[progressbar.position,2].maxvalue:=AWorkCountMax;
end;
procedure TMainForm.DoPatches;
var
i,j:integer;
begin
for I := 0 to GridPatch.DataRowCount-1 do
begin
if GridPatch.Cells[status.position,i] =0 then // status=0:comando da processare
begin
if count_thread<uconfig.configuration.max_thread then // thread non impegnato
begin
GridPatch.Cells[status.position,i]:=1;
GridPatch.CurrentRow:=i;
GridPatch.Refresh;
runthread(i);
end;
end;
sleep(100);
end;
end;
procedure TMainForm.runthread(i:integer);
var
t:Tpatch;
begin
count_thread:=count_thread+1;
t:=Tpatch.Create(true);
t.FreeOnTerminate:=true;
t.Priority:=tpNormal;
t.OnTerminate:= HandleThreadTerminate;
ListPatches.Add(t);
t.start;
end;
procedure Tpatch.Execute;
var
pos:integer;
idHttp:TIdHTTPProgress ;
fs:tfilestream;
begin
//giusto per provare un download
fs:=TFileStream.Create('c:\prova.zip',fmCreate);
mainform. idhttp1.Get('http://download.thinkbroadband.com/20MB.zip',fs);
end;