Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ITask i klase, definiranje u petlji

[es] :: Pascal / Delphi / Kylix :: ITask i klase, definiranje u petlji

[ Pregleda: 743 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon ITask i klase, definiranje u petlji09.04.2020. u 10:08 - pre 48 meseci
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?
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: ITask i klase, definiranje u petlji09.04.2020. u 10:18 - pre 48 meseci
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.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: ITask i klase, definiranje u petlji09.04.2020. u 10:22 - pre 48 meseci
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
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: ITask i klase, definiranje u petlji09.04.2020. u 10:32 - pre 48 meseci
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
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: ITask i klase, definiranje u petlji09.04.2020. u 10:39 - pre 48 meseci
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
...
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: ITask i klase, definiranje u petlji09.04.2020. u 11:07 - pre 48 meseci
Ovo:

SetLength(ta, 4);

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

Zato je 4 out of range.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: ITask i klase, definiranje u petlji

[ Pregleda: 743 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.