Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 1.586 pregleda

Najnovija ↓

ITask i klase, definiranje u petlji 09.04.2020. u 11:08 · pre 79 meseci #1
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?
Re: ITask i klase, definiranje u petlji 09.04.2020. u 11:18 · pre 79 meseci #2
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.
Re: ITask i klase, definiranje u petlji 09.04.2020. u 11:22 · pre 79 meseci #3
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
Re: ITask i klase, definiranje u petlji 09.04.2020. u 11:32 · pre 79 meseci #4
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
Re: ITask i klase, definiranje u petlji 09.04.2020. u 11:39 · pre 79 meseci #5
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
...
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme