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:
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:= :
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:
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:
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?