[ gajo2 @ 22.11.2006. 18:30 ] @
Pozdrav,

Imam jednostavnu listu (sam sam ga pravio) i dva threada. Jedan thread ubacuje iteme u listu, a drugi se vrti u krug, pa kad vidi da lista nije prazna onda vadi item i brise ga iz liste. Dakle nista narocito.

Zanima me samo kako da sinhronizujem ovo. Dakle kada ubacujem ili brisem item, treba da uzmem eksluzivno pravo nad listom. Vidim da postoji TCriticalSection, pa sam napravio ovako nesto:
Code:
critical := TCriticalSection.Create;
critical.Enter;
AddItem(ResultList, item);
critical.Leave;
critical.Free;

Jel ovo dobro ovako?
[ savkic @ 22.11.2006. 20:23 ] @
> Zanima me samo kako da sinhronizujem ovo. Dakle kada ubacujem ili brisem item, treba da uzmem eksluzivno pravo nad listom. Vidim
> da postoji TCriticalSection, pa sam napravio ovako nesto:

Pogledaj TThreadList, upravo je tome namenjen.
[ gajo2 @ 23.11.2006. 11:29 ] @
Hmm ok, napisao sam ovo u jednom threadu:
Code:
with ResultList.LockList do begin
 try
   for i := 0 to Count-1 do begin
      pok := Items[i];
      if pok^.checking = false then begin
        item := pok;
        break
      end
   end;
 finally
   ResultList.UnlockList;
 end
end;

Znaci lock-ujem listu, pretrazujem i nalazim jedan item, uzimam ga i na kraju otkljucavam listu.
E sad problem je sto, nakon sto program stigne do ResultList.LockList nista vise se ne desava u tom threadu. Pogledao sam u Threads debug prozoru i izgleda da se desava sledece:

1) Na pocetku imam samo jedan thread
2) Kliknem na dugme, naprave se ta dva threada, tako da sada imam 3
3) Program stigne do breakpointa (ResultList.LockList)
4) Kliknem na Step Over i thread nestaje sa liste. Da li je moguce da LockList ubija thread?
5) Nakon ovoga samo onaj drugi thread funkcionise, ovaj je izgleda stvarno ubijen
[ gajo2 @ 23.11.2006. 12:57 ] @
Uhhh, nasao sam gresku. ResultList je bio nil u tom trenutku
[ vlaiv @ 30.11.2006. 13:14 ] @
Citat:
gajo2
Zanima me samo kako da sinhronizujem ovo. Dakle kada ubacujem ili brisem item, treba da uzmem eksluzivno pravo nad listom. Vidim da postoji TCriticalSection, pa sam napravio ovako nesto:
Code:
critical := TCriticalSection.Create;
critical.Enter;
AddItem(ResultList, item);
critical.Leave;
critical.Free;

Jel ovo dobro ovako?


Generalno ako ti je to unutar thread-a kada treba da citas, pises, brises onda nije dobro ...

CriticalSection (ili vec critical) bi trebalo da ti je globalna promenljiva.

Kreiras je pre potencialnog koriscenja (najbolje u startapu)

A free-ujes je kad zavrsis ...

Unutar thread-a bi trebalo da bude samo


Code:
critical.Enter;
AddItem(ResultList, item);
critical.Leave;