Kada,zasto i gde koristiti thread-ove ?

2

Kada,zasto i gde koristiti thread-ove ?

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

Ajde da se nastavim na temu!Sto ovo nece da radi,primer sam nasao u tutorialu na progtuts.co.sr ,ako moze mala pomoc zasto primer ne radi! hvala,poz

main Thread :

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     procedure Button1Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end; var   Form1: TForm1;   FirstThread: TThread; implementation {$R *.dfm} uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin   FirstThread := MyThread.Create(true);   FirstThread.FreeOnTerminate := true;   FirstThread.Resume; end; end.

Second Thread :

unit Unit2; interface uses   Windows, Messages, SysUtils, Variants, Classes,   Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls; type   MyThread = class(TThread)   private     { Private declarations }   protected     procedure Execute; override;   end; implementation procedure MyThread.Execute; begin   MessageDlg('Poruka iz threada', mtInformation, [mbOK], 0); end; end.

Hvala,poz

Edit by Srki_82: koristi code tagove.



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

Nasao si gresku u kodu Smile

Nece da radi jer MessageDlg koristi VCL za prikaz dialoga. Umesto MessageDlg napisi:
MessageBox(Application.MainForm.Handle, 'Poruka iz thread-a', 'Information', MB_ICONINFORMATION or MB_OK);

Ispravicemo kod na stranici... Stroze... menjaj Smile



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

Radiiiiiii,hvala,moze jos jedna stvar?
Neki mali primercic i objasnjenje za semafore!
Hvala unapred! Smile

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

@Srki
Problem nastaje kada 2 ili vishe threadova u isto vreme pokusaju da urade istu stvar u istoj instanci. Drugim recima kada pokusavaju da pristupe istim memorijskim adresama. Onda dolazi do access violation-a na svim threadovima osim onog koji je prvi pristupio. Tada se obicno aplikacija zaglavljuje jer thread ne ceka nikog.

Prost primer:
Imas listu (TList) koju si popunio nekim objektima. Napravio si thread koji uzima List[0] objekat i nesto odradi sa njim i tako redom dok se lista ne isprazni.
Ako startujes vise od jedne instance threada, drugi thread ce (u 99% slucajeva) da pristupi list[0] onog momenta kada ga je upravo predhodni thread ocistion. Program puca. Zato kad thread uzima nesto iz liste i chisti je, mora da udje u critical section, ocisti, i izadje iz critical section. Onda ne moze da se desi gore opisano.

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Na single-core rachunarima upotreba thread-ova u desktop aplikacijama ima samo vec pomenutu namenu - da odradi neshto u pozadini bez zaglavljivanja user-inputa. Multi-threaded kod na single-core mashinama je u principu SPORIJI od single-threaded koda.
Imam iskustva sa multi-threaded programima (dodushe, na mashinama koje imaju po 6-8 jezgara i nisu bash 'desktop', tipa Xbox360 i PS3) i jedini savet je da ako ne znate tachno shta radite i zbog chega nemojte ni da pochinjete. Multithreaded programiranje je jako komplikovano.

Iako nije strogo vezano za Delphi, preporuchio bih par stvari za prochitati :

- radove Alexandrescu-a na temu "lock-free structures"

- knjigu "Parallel and distributed programming using C++" (Obavezno shtivo na ovu temu! Ovo ce biti zanimljivo Linuxashima, jer se koriste POSIX thread-ovi, savete i principe mozhete verovatno iskoristiti iz Lazarus-a preko pthread-a)

- Pogledajte OpenMP koji je ukljuchen u VisualStudio2005, i kako kompajler sam mozhe da uradi loop-parallelisation, tj. kako paralelizovati kod bez kodiranja thread-ova (ovo je dodushe samo za C++ i Fortran)

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

@beli0135
Uredu je sve to sto kazes... ja samo kazem da critical section nije jedini nacin za sinhronizaciju thread-ova. Link koji sam prosli put postavio nije bio direktan do sata u kojem se prica o sinhronizaciji pa sam ga sad ispravio. Tamo lepo kazu da moze da se koristi i
Citat:Console input buffers
Events
Mutexes
Processes
Semaphores
Threads
Timers

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

@bNasty

Ima tu jedan problem kod single-core. Kojigod OS da imas, uvek imas 10-ak procesa koji rade u pozadini (servisi), te single thread nije uvek najbrzi metod. Single thread ce uvek biti samo jos jedan proces dodat na listu procesa.
Ako zamislimo da ima 10 servisa, tvoj ce biti 11-ti.
E sada, ako ti kreiras jos 5 procesa, to ce znaciti da ce 16 procesa raditi, a tvoj proggy ce da uzima 6/16 procesorskog vremena.
Ako opet predpostavimo da su svi procesi sa normalnim prioritetom, 6 threadova ce raditi za par puta brzze od single threada koji ce dobiti samo 1/10 vremena.

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Mislim da te nisam bash najbolje razumeo... Razlichiti operativni sistemi drugachije implementiraju time-scheduling, ali ovde prichamo o thread-ovima - oni se nalaze u istom tajm-frejmu sa procesom koji ih poseduje (tako je barem u Win-u, ispravi me ako greshim)

Uglavnom, pod "sporiji" nisam mislio na to koliko ce vremena OS odvojiti procesima sa jednim ili vishe thread-ova (to je ionako stvar OS-a koji mozhe i ne mora da isposhtuje programerov zahtev za prioritetom threadova); vec na chinjenicu da ce UGLAVNOM biti sporiji ako se sa lock/unlock ciklusima ne radi veoma,veoma pazhljivo - thread nije od nikakve koristi ako vecinu vremena cheka da dobije mutex na raspolaganje. Takodje, kreiranje thread-ova uopshte nije brzo i jednostavno za OS, pa ce bez threads-pool-a (kao u Apache-u, ili u OpenMP-u) to josh vishe usporiti stvari.

Uglavnom, ostajem pri stavu da bez preke potrebe ne treba kretati u avanturu multi-threadinga. To jest, ne josh uvek - uskoro ce multi-core mashine biti standard na desktopu. Mentalni sklop velike vecine programera je u single-threadu, to nije lako prevazici. Gotovo legendarni tekst na tu temu ("Free lunch is over"), Herb Sutter-a, je ovde : http://www.gotw.ca/publications/concurrency-ddj.htm .

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

Ma sve to stoji. Zavisi sve od cilja, tj od toga sta ti treba. Recimo, asinhroni procesi ne mogu uopste da se urade bez threadova.

Dopuna: 01 Mar 2006 0:39

BTW, Jel zna neko kako koristiti TCriticalSection u lazarusu?

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

http://www.freepascal.org/docs-html/prog/progse42.html#x196-20000010.3

Ko je trenutno na forumu
 

Ukupno su 628 korisnika na forumu :: 5 registrovanih, 1 sakriven i 622 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: bato, cikadeda, JOntra, slonic_tonic, vathra