Threadlist e progressbar

di il
3 risposte

Threadlist e progressbar

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;

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte