[ 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? |