Threadlist e progressbar

di
Anonimizzato21953
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

  • Re: Threadlist e progressbar

    L'accesso alla progress dentro la lista l ho risolto...
    ora parte il download e la progress aumenta.

    il problema è che funziona pero' solo se faccio un thread alla volta,
    se per esempio partono due threas, relativi a due download, per esempio prima e seconda riga, la progressbar che segna il download è sempre quella dell'ultima riga.

    Non so come poter memorizzare o recuperare la riga della grid all'interno del metodo "work"
  • Re: Threadlist e progressbar

    Guarda se questo esempio potrebbe fare al caso tuo.

    https://www.experts-exchange.com/questions/23907054/Delphi-Multi-Thread-with-IDHTTP.html
  • Re: Threadlist e progressbar

    Sembra fare al mio caso, ci provo, ti ringrazio.
Devi accedere o registrarti per scrivere nel forum
3 risposte