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

Problem sa BeginThread()

[es] :: Pascal / Delphi / Kylix :: Problem sa BeginThread()

[ Pregleda: 2951 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Problem sa BeginThread()28.01.2005. u 18:32 - pre 234 meseci
Kad pokusam da sa BeginThread() napravim jedan thread, delphi mi izbaci gresku, nesto kao Code 5 : Access is denied

Evo fje koju treba da threadujem :

Code:

procedure TMainWindow.CollapsePanel; stdcall;
begin
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_BELOW_NORMAL);

  While Panel2.Left < Left + ClientWidth - 3 Do
  Begin
    Panel2.Left := Panel2.Left + 5;
    UltimGrid.Width := UltimGrid.Width + 5;
    Panel2.Refresh;
    UltimGrid.Refresh;
  End;

  ExitThread(0);
end;


Medjutim, kad izbacim while petlju, thread odsljaka super.
Gde gresim ?


P.S. : Necu da koristim gotove thread klase.

poz
 
Odgovor na temu

neor
Nenad Orlovic

Član broj: 26828
Poruke: 74
*.metrohive.net.



Profil

icon Re: Problem sa BeginThread()28.01.2005. u 19:29 - pre 234 meseci
Verovatno ti problem pravi to sto vizuelne VCL komponente nisu threadsafe pa sve sa njima mora da se izvrsava u glavnom threadu sto postizes sa Synchronize funkcijom.
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.vdial.verat.net.



+1 Profil

icon Re: Problem sa BeginThread()29.01.2005. u 12:06 - pre 234 meseci
Po kodu mi se cini da bi hteo da napravis "klizajuci" panel sa UltimGridom na njemu i verovatno bi panel trebao da "klizne" ako se stisne neko dugme ili nesto. Ne znam tacno sta ti ne dozvoljava threadu da se izvrsi, ali bi problem mogao da resis bez threada samo dodajuci Application.ProcessMessages u okviru while petlje. Na taj nacin program se izvrsava dok panel "kliza" (drugi eventovi se dogadjaju), jedino se ne izvrsava neki kod POSLE while-a (u toj istoj proceduri) dok while ne zavrsi, ali ako zelis da postignes samo "klizanje", slobodno koristi App.PcsMsgs (i ne treba ti Repaint-Refresh posto App.PcsMsgs to radi za tebe).

I jos dve stvari: brzina "klizanja" zavisice od brzine masine, da je fiksiras korisiti Sleep u okviru while-a, a da ne bi eksplicitno pomerao i panel i UltimGrid, stavi anchors od UltimGrida na Left i Right, tako resizovanjem panela (pos sirini) resizujes i UltimGrid(naravno, pod uslovom da je panel parent za UltimGrid).
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Problem sa BeginThread()29.01.2005. u 12:37 - pre 234 meseci
Da, znam za Application.ProcessMessages, ali mi je nekako bolje preko threadova. Nema veze, uradio sam ovo preko timer-a - tako ce brzina uvek biti ista.

Hvala
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.197.eunet.yu.



+1 Profil

icon Re: Problem sa BeginThread()29.01.2005. u 17:04 - pre 234 meseci
Nikakvo mesanje glavne niti u kojoj radi VCL i sporednih niti nije pametno ni predvidjeno da se radi. Problem je mnogo veci nego sto na prvi pogled izgleda. U zavisnosti od konkretnog koda program moze raditi deset, dvadeset startovanja besprekorno, ali npr. dvadesetprvi moze srusiti program. Zato i postoji klasa TThread koju nasledjujes i ima Synchronize() metod koji ceka da glavna nit udje u petlju za poruke i onda nema opasnosti da dodje do konflikta. Naravno mozes i sam da resis sinhronizaciju ali ljudi su to vec odradili...

Kontrole u Delphi-u nisu thread safe, ali su graficki objekti (TFont, TBitmap...) sigurni.

Ako imas MSDN mozes pogledati neke tekstove na ovu temu (ima ih preko 20-30) i mozes sagledati problematiku niti, a usput i videti sta sve Windows ima od alata za sinhronizaciju procesa i niti (kriticne sekcije, semafori...) i kako su oni iskorisceni u Delphi-u.

Ova tema ce biti sve interesantnija kako se budu krajem godine poceli pojavljivati procesori sa dva prava jezgra (HT kod P4 ne racunam) i kada standardno pisane aplikacije vise ne budu mogle da ostvaruju ubrzanje bez ozbiljne revizije koda koja ce omoguciti da se iskoriste oba jezgra.
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.vdial.verat.net.



+1 Profil

icon Re: Problem sa BeginThread()29.01.2005. u 17:39 - pre 234 meseci
Citat:
morlic: Nikakvo mesanje glavne niti u kojoj radi VCL i sporednih niti nije pametno ni predvidjeno da se radi. Problem je mnogo veci nego sto na prvi pogled izgleda. U zavisnosti od konkretnog koda program moze raditi deset, dvadeset startovanja besprekorno, ali npr. dvadesetprvi moze srusiti program. Zato i postoji klasa TThread koju nasledjujes i ima Synchronize() metod koji ceka da glavna nit udje u petlju za poruke i onda nema opasnosti da dodje do konflikta. Naravno mozes i sam da resis sinhronizaciju ali ljudi su to vec odradili...


Nije mi bas najjasnije sta smatras pod sporednim nitima, ako mozes samo malo da pojasnis, hvala.
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.126.eunet.yu.



+1 Profil

icon Re: Problem sa BeginThread()30.01.2005. u 01:23 - pre 233 meseci
Pod sporednim nitima smatram bilo koji dodatnu nit koja radi u programu. Recimo da si napravio FindFile nit koja radi pretragu u pozadini ostavljajuci UI da radi bez trzanja. Rec "sporedne" sam sam smislio, i moguce da nije najsrecnije resenje :)
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.vdial.verat.net.



+1 Profil

icon Re: Problem sa BeginThread()30.01.2005. u 16:25 - pre 233 meseci
Stani, cekaj, pazi, gledaj... opet mi nije jasno...

U cemu je onda svrha threadova ako ne bi trebalo da se koriste paraleleno sa glavnim programom (ako program korisit VCL, sto je u 99% slucajeva). Kako ih onda uopste koristiti? Da mozda uopste nema glavnog programa nego samo niti?

Pitam jer do sada nisam naleteo na potrebu za njima (najvise app.pcsmsgs za moje potrebe), ali ako ih budem koristio da bar znam kako je pravilno...
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Problem sa BeginThread()30.01.2005. u 17:04 - pre 233 meseci
Najbolje da radis preko TThread klase...
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.61.EUnet.yu.



+1 Profil

icon Re: Problem sa BeginThread()30.01.2005. u 17:19 - pre 233 meseci
Mozda sam se pogresno izrazio. Pod "mesanjem" sam mislio na mesanje bez sinhronizacije koja je predvidjena za takve slucajeve. Znaci treba koristiti niti, ali ukoliko pristupaju VCL-u treba koristiti sinhronizaciju kako ne bi dolazilo do problema (kao sto ih je Marko imao). Moze da se radi i sinhronizacija i kada se koristi BeginThread() ali to je druga prica. Ako nekog interesuje mozemo da obradimo...
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Problem sa BeginThread()01.02.2005. u 08:14 - pre 233 meseci
Evo da ja nesto napisem o thread-ovima...

1) U svakoj aplikaciji/procesu postoji nesto sto se zove MainThread. Proces i ne moze da postoji bez bar jednog thread-a. Dodatni thread-ovi (kreirani od strane user-a) se obicano nazivaju worker thread-ovi, i njihovim koriscenjem se mogu pisati vrlo mocni programi.

2) Koja je osnovna razlika izmedju mainthred-a i worker thread-ova? Vrlo jednostavna: Mainthread ima sposobnost/zadatak handle-ovanja sistemskih poruka (pogledati u API-ju, recimo, ThreadWindow). Delphi-jevi TThread descendenti (worker thread-ovi) nisu window thread-ovi, to jest nemaju message handler.

3) Iz tog razloga nije preporucljivo da worker thread-ovi rade iscrtavanje windows kontrola; svako crtanje kontrola podrazumeva kisu poruka koje u ovom slucaju nisu obradjene; do kraha programa dolazi kada se mainthread (ciji je posao crtanje i osvezavanje win kontrola) SUKOBI sa worker thread-om (koji se mesa gde mu nije mesto).

4) Pogledati u VCL-u unit Classes.pas; ima jedna procedura iznad konstruktora TThread.Create a poziva se u njemu; lepo se moze videti kako se 'kaci' message handler prilikom kreiranja prvog (main) thread-a; u narednim pozivima tog konstruktora (by user) se kreiraju obicni worker thread-ovi i radi se samo increment internog brojaca.

5) Sinhronizacija. Pomenuta je vec procedura Synchronize(), medjutim tu ima jedna kvaka: thread mora da ceka sopstveni 'izlazak' iz te procedure, drugim recima thread MIRUJE neko vreme.
Bolji (i malo slozeniji) nacin je preko PostMessage(); u tom slucaju, user definise neki svoj tip poruke za prenos informacija, worker thread 'ispali' poruku ka parent formi recimo (ili ciljanoj kontroli, sta vec) i ide dalje. Dodatni posao je pisanje (overriding) message handler-a ciljane kontrole za obradu nase poruke. U ovom slucaju nema thread kolizije, jer se message handler-i izvrsavaju od strane mainthread-a. A ko je 'dobacio' poruku kreiranu od strane worker thread-a do message handler-a za mainthread? Pa, Bog...pardon, operativni sistem :)).

6) U pomenutom Classes.pas mozete videti i kako radi Synchronize() metoda; pa to je obicni SendMessage(), koji za razliku od PostMessage() CEKA ('does not return until...') odgovor ciljane kontrole, to jest ceka obradu poslate poruke od strane nekog handler-a.

I to bi bilo to; pozdrav

Rajko

P.S. Evo sad sam malo pogledao/obnovio materiju: MainThread ima message queue, a ne message handler; ovaj drugi pripada window kontroli. Inace, sasvim je moguce kreirati dodatne forme/threadwindow-e u aplikaciji, ali ne bez teske API-cine (citaj: ne moze koriscenjem samo Delphi klasa, recimo TThread).
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.186.eunet.yu.



+1 Profil

icon Re: Problem sa BeginThread()01.02.2005. u 20:13 - pre 233 meseci
Svaka cast na objasnjenju, nisam mislio da to moze da se objasni u tri pasusa!
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Problem sa BeginThread()02.02.2005. u 08:28 - pre 233 meseci
Hvala, hvala...:)
A to za tri pasusa, pa to je vec profesionalna deformacija: utrenirano rezonovanje, ko moj klinac kad slaze Lego kockice :)))

Rajko
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa BeginThread()

[ Pregleda: 2951 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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