[ FranjoZG @ 16.01.2016. 13:05 ] @
Radim sa Delphi XE7

U Ovom delphi-u je pojednostavljen rad sa TTaskom, ali sam shvatio da imam problem s odgonetavanjem da li je taks završio ili nije...

na proc. main forme:
OnClseQuery imam provjere i gašenje task-ova ako su još aktivni:
Code:

   if (fTaskUpdate <> nil) and (fTaskUpdate.Status = TTaskStatus.Running) then 
       fTaskUpdate.Cancel;



i nakon toga:
Code:

   while (fTaskUpdate <> nil) and (fTaskUpdate.Status = TTaskStatus.Running) do Sleep(1000);


na provjeri taksa mi javlja "Access vi...." i to ako je task završio svoj posao. Mislim da je i očekivano jer je pozvao svoj Destroy.

Kako znato da je task još uvijek aktivan? Pada mi na pamet korištenje varijable u main-u koju bih setirao true/fasle u Create i Destroy task-a.
Ima li bolji način?
[ savkic @ 16.01.2016. 13:26 ] @
> na provjeri taksa mi javlja "Access vi...." i to ako je task završio svoj posao. Mislim da je i očekivano jer je
> pozvao svoj Destroy.
> Kako znato da je task još uvijek aktivan?

Preko Statusa je mislim preporučeni način, ali nisam siguran da su promenljive na njih predvidjene da budu globalne.
Obično je da ga napraviš u nekoj metodi i startuješ i onda ili čekaš da završi ili prosto i ne čekaš.

> Pada mi na pamet korištenje varijable u main-u koju bih setirao true/fasle u Create Destroy task-a. Ima li bolji način?

Mozes koristiti Evente za to.
A zašta će ti informacija da li je završio, kad to koristiš?
[ FranjoZG @ 16.01.2016. 14:21 ] @
Pokrenem task za update podataka (local <->web) koji se vrti ispod tako da program može raditi jer sinhronizacija podataka traje duže vrijeme.

Što ako korisnik želi napustiti program prije nego je završila sinhronizacija? Za samu sinh. nema uticaja jer sam provjere taks.canceled stavljao tamo gdje prekidi ne ometaju proceduru.

Pokušao sam clos-ati program, a da ne obračam pažnju na tasko-ove. Ne valja - javlja grešku...
[ savkic @ 16.01.2016. 17:13 ] @
> Što ako korisnik želi napustiti program prije nego je završila sinhronizacija? Za samu sinh. nema uticaja jer sam provjere
> taks.canceled stavljao tamo gdje prekidi ne ometaju proceduru.
> Pokušao sam clos-ati program, a da ne obračam pažnju na tasko-ove. Ne valja - javlja grešku...

Koju grešku?
Taskovi su u osnovi metode koje se izvršavaju u posebnom threadu, a dodatne threadove sistem sam uništi ako ti to ne učiniš. Ja obično na izlasku iz programa čekam do 1s na thread i ako još nije završio samo nastavim sa izlazom a sistem sam počisti. I kod tebe bi nesto tako trebalo biti slucaj kad izlazis iz programa.
[ FranjoZG @ 16.01.2016. 21:55 ] @
Riješio sam problem...
1. ja sam griješio jer sam pomješao objekt klase tthread (Delphi 10) i tTask u XE7, a u kom sam kreirao objekt svoje klase, pa se malo spetljah....
2. da li je task završen ili nije, utvrđujem s varijablom iz main forme:
na početku taska: Inc(Var)
na kraju taska: Dec(var)
kod closanja forme provjeravam da li je Var = 0
[ Rapaic Rajko @ 18.01.2016. 10:49 ] @
Da li taj Var (otkud da varijablu nazoves po sluzbenoj reci?) inkrementujes/dekrementujes iz samog taska?
Ako DA, i ako imas vise taskova, onda koristi InterlockedIncrement i InterlockedDecrement API funkcije; osiguravaju threadsafe pristup argumentu funkcije.

Pozz
[ FranjoZG @ 24.01.2016. 17:36 ] @
Increment varijable radim u task-u. Na početku i na kraju pa provjeravam je li parna
Trebao bih inc - dec pa pa provjeriti je li 0. sad kad pišem post - ne sječam se zašto nisam tako radio i zašto sam zaključio da je bolje inc - inc :)

- nije Var, samo sam napisao kao primjer.
- da korisim InterlockedIncrement

tako sada radi OK.