Kada,zasto i gde koristiti thread-ove ?

1

Kada,zasto i gde koristiti thread-ove ?

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

Naslov sve kaze!Hvala na odgovorima,pozzzz



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Koristim ih kad god je potrebno da se izvrsi neka dugotrajna operacija. Umesto da se korisniku zamrzne interfejs, thred jednostavno radi u pozadini, a korisnik na interfejsu ima obavestenje (vrti se sat ili nesto slicno) da se operacije vrse u pozadini.

U poslednje vreme thread-ove koristim za pisanje igara... mnogo je jednostavnije kada se, recimo, iscrtavanje i AI neprijatelja razdvoji u thread-ove.



offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Prva potreba ti se javlja kod operacija koje dugo traju. Ako Main thread (glavni thread aplikacije, koji se brine i o samom interfejsu aplikacije) odradjuje tako dugacku operaciju, program ti je zauzet sve dok se operacija ne zavrsi.
Desava se i da se prozor aplikacije zamrzne, nebitno na koliko mesta stavljao 'application.processmessages'...

Zato je bolje da se ta dugacka operacija vrsi u threadu, a programu dozvoliti da funkcionise i dalje. Naravno, pre izvrsenja threada postavi na enabled := false sve one dugmice koji bi mogli da zasmetaju threadu, ili bi njihovim delovanjem rezultat threada bio poremecen.

Dopuna: 26 Feb 2006 22:40

Srki me pretece Wink

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Thread-ove je vrlo retko potrebno koristiti... ja sam ih do sad koristio u mozda 3-4 aplikacije, a napisao sam ih dosta. Thread u nekim situacijama moze biti vrlo koristan, dok ga je u drugim vrlo tesko koristiti.

Najveci problemi se desavaju prilikom sinhronizacije podataka... posto se thread-ovi izvrsavaju istovremeno moze se desiti da npr. dva ili vise thread-a pristupaju istoj promenljivoj... ako svi samo citaju podatke, tada nema problema, ali ako se desi da upisuju onda moze doci do korupcije podataka... npr. 2 thread-a koriste globalnu promenljivu Boja u kojoj cuvaju boju text-a za ispis. Prvi thread upisuje CRVENO i sprema se za ispis, ali pre nego sto pocne sa ispisom, drugi thread upise PLAVO i kada se text-ovi budu ispisali, i za jedan i za drugi thread ce biti plave boje.
Ovo je sitnica u poredjenju sa problemima koji mogu nastati kada thread-ovi kreiraju i oslobadjaju dinamicke promenljive... vrlo lako moze doci do access violation-a ili slicne greske.

Moj savet je da koristite thread-ove samo kada je to apsolutno potrebno... i nemojte kreirati mnogo thread-ova jer ce usporiti ceo operativni sistem.

Vise o thread-ovima mozete naci ovde.

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

@Srki
Onda iskoristis critical section.
Kada thread upadne u critical section, ostali threadovi pauziraju dok thread ne izadje iz critical section.

Info:
http://www.delphicorner.f9.co.uk/articles/op4.htm

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ja koristim semafore ili slicne trigere... kada neki od thread-ova treba da menja promenljivu postavi odgovarajuci semafor tako da drugi thread-ovi znaju da je ta promenljiva zauzeta i mogu da rade nesto drugo ako imaju ili da cekaju dok promenljiva ne bude slobodna.

Nikad nisam voleo critical section... ne svidja mi se ideja da mi se thread zakoci, a da ja za to ne znam Smile

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

Hvala,na odgovorima!Pozzz

offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23158
  • Gde živiš: Niš

Srki_82 ::Nikad nisam voleo critical section... ne svidja mi se ideja da mi se thread zakoci, a da ja za to ne znam Smile

TryEnterCriticalSection(&cs);

http://msdn.microsoft.com/library/en-us/dllproc/ba.....frame=true

The TryEnterCriticalSection function attempts to enter a critical section without blocking. If the call is successful, the calling thread takes ownership of the critical section.
If another thread already owns the critical section, the return value is zero.

offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

Srki, klimav si sine za ozbiljne stvari. Ovo je iz najbolje namere. Nauchi thredove, zivot ce ti postati zanimljiviji, a i otvorice ti se vizija za nove stvari i ideje.
BTW, critical section je jedini nacin da ti aplikacije (ako nije single-threaded) bude thread-safe.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

@Peca

Nisam ni znao za tu funkciju, hvala Smile

@beli0135
Citat:BTW, critical section je jedini nacin da ti aplikacije (ako nije single-threaded) bude thread-safe.
Mozda sam ja pogresno shvatio izraz "thread-safe"... isparvi me ako gresim... to znaci da se u aplikaciji ne desava da vise thread-ova pokusava da radi nesto s memorijim sto bi dovelo do korupcije podataka tj. da aplikacija koristi sinhronizaciju thread-ova?

Microsoft kaze critical section nije jedini nacin, kao sto ti kazes, da se to uradi:
http://msdn.microsoft.com/library/en-us/dllproc/ba.....hreads.asp

Ko je trenutno na forumu
 

Ukupno su 418 korisnika na forumu :: 6 registrovanih, 2 sakrivenih i 410 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Rade, RiV, sasa76, wizzardone, zile54, 1107