Poslao: 27 Feb 2006 16:02
|
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.
|
|
|
Poslao: 27 Feb 2006 16:34
|
offline
- Pridružio: 03 Jan 2006
- Poruke: 37
|
Radiiiiiii,hvala,moze jos jedna stvar?
Neki mali primercic i objasnjenje za semafore!
Hvala unapred!
|
|
|
|
Poslao: 27 Feb 2006 21:18
|
offline
- beli0135
- Executor
- 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.
|
|
|
|
Poslao: 27 Feb 2006 21:32
|
offline
- bNasty
- Građanin
- 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)
|
|
|
|
Poslao: 28 Feb 2006 00:19
|
offline
- Srki_82
- Moderator foruma
- 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
|
|
|
|
Poslao: 28 Feb 2006 04:50
|
offline
- beli0135
- Executor
- 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.
|
|
|
|
Poslao: 28 Feb 2006 20:34
|
offline
- bNasty
- Građanin
- 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 .
|
|
|
|
Poslao: 01 Mar 2006 00:39
|
offline
- beli0135
- Executor
- 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?
|
|
|
|
|