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

Sinhronizacija liste

[es] :: Pascal / Delphi / Kylix :: Sinhronizacija liste

[ Pregleda: 2035 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gajo2
Budapest

Član broj: 62614
Poruke: 518
*.ptt.yu.

Sajt: b.flyingoranges.com


+117 Profil

icon Sinhronizacija liste22.11.2006. u 18:30 - pre 212 meseci
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?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sinhronizacija liste22.11.2006. u 20:23 - pre 212 meseci
> 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.
 
Odgovor na temu

gajo2
Budapest

Član broj: 62614
Poruke: 518
*.ptt.yu.

Sajt: b.flyingoranges.com


+117 Profil

icon Re: Sinhronizacija liste23.11.2006. u 11:29 - pre 212 meseci
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
 
Odgovor na temu

gajo2
Budapest

Član broj: 62614
Poruke: 518
*.ptt.yu.

Sajt: b.flyingoranges.com


+117 Profil

icon Re: Sinhronizacija liste23.11.2006. u 12:57 - pre 212 meseci
Uhhh, nasao sam gresku. ResultList je bio nil u tom trenutku
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.metrohive.net.



+1 Profil

icon Re: Sinhronizacija liste30.11.2006. u 13:14 - pre 211 meseci
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;
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Sinhronizacija liste

[ Pregleda: 2035 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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