[ FranjoZG @ 09.04.2020. 10:08 ] @
Imam desetak klasa za koje sam definirao interface, a htio bih ih vrtiti kao zasebne taskove, istovremeno.
Klase imaju iste property-e i methode, rade različite stvari. Ova test klasa postavlja progressbar na panel i sa sleep(500) ga povećava do max (10).
Problem je kada u petlji pokušavam definirati task-ove:
Code:

var i: icl;
    x: integer;
    tt: ITask;
    ta: array of ITask;
begin
  // kreiram taskove i smještam ih u listu
  il := tlist<icl>.Create;
  for x := 0 to 4 do begin
     i := tcl.create(p);
     il.Add(i);
  end;
  
  SetLength(ta, 4);

  for x := 0 to 4 do begin
     ta[x] := TTask.Create(procedure()
        begin
          il[x].Execute;
        end).start;
  end;
  
   while not TTask.WaitForAll(ta, 1000) do
   begin
        CheckSynchronize(0);
        Application.MainForm.Update;
   end;

Program mi javi: raise exception class EArrgumentOutOfRangeException with message 'Argoment out of range'

Kada postavim breakpoint na redak for x:= :
Code:

    for x := 0 to 4 do begin
        ta[x] := TTask.Create(procedure()
        ...

u Watch List, za var "x" mi kaže: E2003 Undeclared identifier: 'x'

kada pogledam "ta" prije izvršenja naredbe:
Code:

     while not TTask.WaitForAll(ta, 1000) do

ta sadrži 4 ITaska, svaki ima drugu adresu.

Ako umjesto petlje ručno kreiram taskove, jedan po jedan, ne javlja grešku, progressbar normalno odradi:
Code:

     ta[0] := TTask.Create(procedure()
        begin
          il[0].Execute;
        end).start;
  
     ta[1] := TTask.Create(procedure()
        begin
          il[1].Execute;
        end).start;
     ta[2] := TTask.Create(procedure()
        begin
          il[2].Execute;
        end).start;
  
     ta[3] := TTask.Create(procedure()
        begin
          il[3].Execute;
        end).start;
  
     ta[4] := TTask.Create(procedure()
        begin
          il[4].Execute;
        end).start;


Ne mogu shvatiti u čemu je problem. Vidi li itko grešku?
[ FranjoZG @ 09.04.2020. 10:18 ] @
Da sam prije pisao, prije bih našao rješenje :)
Mada mi nije jasno zašto!
Task-ove kreiran u zasebnoj funkciji:
Code:

  for x := 0 to 4 do begin
     ta[x] := CreateTesk(x, il);
     ta[x].Start;
  end;
...
function TForm6.CreateTesk(IndI: integer; ListI: tList<icl>): ITask;
begin
   result := TTask.Create(procedure()
      begin
         Listi[IndI].Execute;
      end);
end;


Na ovaj način radi. Eto, možda će nekom trebati iako mi nije jasno zašto se tako ponaša.
[ djoka_l @ 09.04.2020. 10:22 ] @
Varijabla koja se koristi u for konstrukciji je NEDEFINISANA van petlje.

Osim toga, ti želiš da napraviš 4 taska, a vrtiš 5 puta petlju, za vrednosti 0,1,2,3,4 zato ti javlja index out of range
[ djoka_l @ 09.04.2020. 10:32 ] @
U većini paskaloidnih jezika loop varijabla ne mora ni da se definiše, a njen scope je petlja.
Primer PL/SQL:
Code:
declare
   i number := 13;
begin
  DBMS_OUTPUT.PUT_LINE(i);
  for i in 1..2 loop
     DBMS_OUTPUT.PUT_LINE(i);
  end loop;
   DBMS_OUTPUT.PUT_LINE(i);
end;
/

Rezultat:
Code:
13
1
2
13
[ FranjoZG @ 09.04.2020. 10:39 ] @
Citat:
djoka_l:
Varijabla koja se koristi u for konstrukciji je NEDEFINISANA van petlje.

Osim toga, ti želiš da napraviš 4 taska, a vrtiš 5 puta petlju, za vrednosti 0,1,2,3,4 zato ti javlja index out of range


Kod prepisivanja sam napravio grešku, vrtim 5 puta i definiran je array[5]. To nije greška.

varijabla je definirana:
Code:

var i: icl;
    x: integer;  <<== definirana varijabla za for petlju
    tt: ITask;
    ta: array of ITask;
begin
...
[ tkaranovic @ 09.04.2020. 11:07 ] @
Ovo:

SetLength(ta, 4);

daje 0..3 a ne 0..4.

Zato je 4 out of range.