Qt QThread
Dobrodošli, Gost. Molim vas prijavite se ili se registrujte.

Prijavite se sa korisničkim imenom, lozinkom i dužinom sesije

Linuxo Forumi

Stranice: [1]   Idi dole
  Štampaj  
Autor Tema: Qt QThread  (Pročitano 1725 puta)
0 članova i 1 posetilac pregledaju ovu temu.
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« poslato: 13 Децембар 2007, 00:55:26 »

Da li je neko koristio QThread klasu iz Qt biblioteke? Imam neka pitanja, a primeri su mi nedovoljni. Suviše su elementarni.
Prijavi uredniku   Sačuvana
sysctl
Full Member
***
Van mreže Van mreže

Pol: Muškarac
Poruke: 168


spiderpig


« Odgovor #1 poslato: 13 Децембар 2007, 17:10:49 »

Ja sam koristio. Sta te konkretno interesuje ?
Prijavi uredniku   Sačuvana

Kod:
    fprintf(stderr,"iza svakog %d ugla vreba Dragan Kojic Keba\n",i++);
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« Odgovor #2 poslato: 13 Децембар 2007, 19:28:34 »

1. Da li QThread::start() startuje thread detached ili non-detached?

2. Za multithread programiranje važi da treba zaključati mutex-ima delove koda koji pristupaju zajedničkim delovima memorije, npr. preko pointera. U primeru mandelbrot vrši se lock-ovanje kod pristupa članovima klase. Da li je neophodno i zašto?

3. Da li treba lock-ovati emitovanje signala s obzirom da se oni izvršavaju trenutno, a ne odloženo, a eventualno mogu menjati zajedničke podatke iz zajedničke klase iz koje su thread-ovi i kreirani?

4. Da li je dovoljno regularno napustiti run() metodu za nestajanje thread-i ili je treba i eksplicitno obrisati sa deleteLater()?
...

Biće još  Wink
« Poslednja izmena: 13 Децембар 2007, 19:46:35 od jboban » Prijavi uredniku   Sačuvana
zevs
Newbie
*
Van mreže Van mreže

Poruke: 4


« Odgovor #3 poslato: 14 Децембар 2007, 00:15:45 »

1. joinable (non-detached)
2. Ne znam za koji primer mislis ali potrebno je zakljucati pristup zajednickim delovima memorije ako nisu u pitanju atomicne operacije da bi se osiguralo da samo jedna nit tim podacima pristupa u jednom trenutku...
3. ne
4. kad napustis run() metod nit se zavrsava, ali objekat ostaje (tj memorija koju zauzima).
Prijavi uredniku   Sačuvana
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« Odgovor #4 poslato: 14 Децембар 2007, 00:32:53 »

2. Ne znam za koji primer mislis ali potrebno je zakljucati pristup zajednickim delovima memorije ako nisu u pitanju atomicne operacije da bi se osiguralo da samo jedna nit tim podacima pristupa u jednom trenutku...
Radi se o primeru examples/threads/mandelbrot iz Qt instalacije. U ovom primeru su zaključavani delovi koda koji pristupaju privatnim članovima klase, a ne znam zašto. Svaka thread ima svoju instancu klase, svoje privatne promenljive i one nisu zajedničke.
4. kad napustis run() metod nit se zavrsava, ali objekat ostaje (tj memorija koju zauzima).
Ovo sam loše pitao jer sam ovo već imao rešeno sa:
Kod:
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
Prijavi uredniku   Sačuvana
zevs
Newbie
*
Van mreže Van mreže

Poruke: 4


« Odgovor #5 poslato: 14 Децембар 2007, 01:07:18 »

Sad sam na brzinu pogledao taj primer, mislim da sam nasao objasnjenje... Nadam se da ne gresim, nisam imao vremena da detaljno prostudiram.

Zasticeni su mutexima jer obe niti rade sa objektom klase RenderThread, tj imas jednu nit koja izvrsava funkciju run() i drugu koja poziva javni metod render().
Prijavi uredniku   Sačuvana
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« Odgovor #6 poslato: 14 Децембар 2007, 01:57:37 »

Jeste, tačno to. Sad sam i ja pogledao detaljnije.
Prijavi uredniku   Sačuvana
sysctl
Full Member
***
Van mreže Van mreže

Pol: Muškarac
Poruke: 168


spiderpig


« Odgovor #7 poslato: 14 Децембар 2007, 17:21:00 »

Ovako

1. Interni thread koji QThread klasa sadrzi se kreira sa PTHREAD_CREATE_DETACHED, joinable state (pthread_join) se simulira
sa QThread::wait, ako se dobro secam, najverovatnije zbog internog event loop-a koji QThread poseduje.

2. Sto se tice upotrebe mutexa i/ili sinhronizovanja pristupa deljenoj memoriji stvari stoje ovako: pristup i manipulacija svim implicitno deljenim klasama (QString, QImage i sve ostale koje imaju implicit sharing) se moze
obaviti bez zakljucavanja/sinhronizovanja iz vise razlicitih niti, sto znaci da se sve klase ovog tipa posmatraju kao reentrant, (ali ne i thread-safe, za pristup istom objektu se opet mora koristit lock  Cheesy). U svakom drugom slucaju se mora koristit neka vrsta sinhronizacije (QMutex, QWaitCondition, QSemaphore,...)

3. Emitovanje signala ne bi trebalo lock-ovati (Qt vrsi neku vrstu serijalizovanja istih ako se tacno secam), ali je potrebno sinhronizovati slot koji prima signal sa ostalim nitima (posebno sa glavnim GUI thread-om)

4. Ovo je vec odgovoreno

Postoji jos nekoliko bitnih stvari, sve objekte izvedene od QWidget i ostalih GUI klasa nije moguce kreirati u
jednom thread-u, a pozivati funkcije iz drugog, preciznije sve GUI klase se mogu koristiti samo iz glavnog GUI thread-a.

Sto se tice mandelbrot/fraktal primera, pretpostavljam (posto nemam src isped sebe, ali se secam kako izgleda Smiley)
da se vrsi sinhronizacija izmedju worker thread-a i glavnog GUI thread-a (bas iz razloga koji sam naveo gore),
gde worker racuna fraktal, pa obavestava gui thread da moze da ga iscrta na formi (ili tako nesto)
Prijavi uredniku   Sačuvana

Kod:
    fprintf(stderr,"iza svakog %d ugla vreba Dragan Kojic Keba\n",i++);
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« Odgovor #8 poslato: 14 Децембар 2007, 20:38:12 »

najverovatnije zbog internog event loop-a koji QThread poseduje.
Da, čak za verziju 4.4 najavljuju podrazumevano obavezno korišćenje event loop-a u QThread klasi.
U svakom drugom slucaju se mora koristit neka vrsta sinhronizacije
Čak i u slučaju podataka članova dva različita objekta, tipa Objekat1.podatak, Objekat2.podatak? Za sve deljene zajedničke resurse je razumljivo da mora.
(posebno sa glavnim GUI thread-om)
Kakva je situacija sa non-GUI? Npr. ja koristim QCoreApplication jer aplikacija nije grafička.
Prijavi uredniku   Sačuvana
sysctl
Full Member
***
Van mreže Van mreže

Pol: Muškarac
Poruke: 168


spiderpig


« Odgovor #9 poslato: 23 Децембар 2007, 01:05:33 »

Pa da covece, npr, ako zelis da pristupis/kopiras Objekat2.podatak1 u Objekat1.podatak1 (i oni su u razlicitim nitima) moras da koristis neku vrstu
sinhronizacije, osim ako su objekti instance implicit shared klasa (QString, etc...)

Citat
Kakva je situacija sa non-GUI? Npr. ja koristim QCoreApplication jer aplikacija nije grafička.

Ponovo koristis Qt za mrezno programiranje  Smiley Na sta konkretno mislis sa QCoreApplication ? Ponovo na sinhronizaciju niti ? U svakom slucaju vaze ista pravila, mada ti ne mogu sa sigurnoscu reci da li je isto kao sa QApplication
jer nikad nisam pisao nesto tog tipa, mozda zevs zna ?
Prijavi uredniku   Sačuvana

Kod:
    fprintf(stderr,"iza svakog %d ugla vreba Dragan Kojic Keba\n",i++);
zevs
Newbie
*
Van mreže Van mreže

Poruke: 4


« Odgovor #10 poslato: 23 Децембар 2007, 05:49:54 »

Pravio sam neke jednostavne programcice koji su non-gui i sto se mene tice sve je bilo isto. Izbegavam da koristim qt ako mi ne treba gui tako da nemam previse iskustva (radije koristim osnovne systemske pozive i stl zbog problematike sa updateovanjem qt-a), ali u principu samo izbegnem kreiranje glavnog dijaloga i pozivanje show metoda...
Imam i jedan programcic koji ako se pozove sa -g pokaze gui inace ne.
Prijavi uredniku   Sačuvana
jboban
Hero Member
*****
Van mreže Van mreže

Pol: Muškarac
Poruke: 850



« Odgovor #11 poslato: 23 Децембар 2007, 16:48:44 »

Ponovo koristis Qt za mrezno programiranje
Naravno. Šta je tu loše? Ne sećam se da sam i ranije dobio neki konkretan odgovor na ovo pitanje, a šta je dobro, znam cool
Na sta konkretno mislis sa QCoreApplication ?
Uvek se pominje glavni GUI thread, npr. kad se pomene sinhronizovanje i sl., a ne vidim razliku od non-GUI. U čemu se razlikuje GUI od non-GUI thread?
Pomenuo sam QCoreApplication koji govori da ne koristim GUI pa me zanima razlika jer je nisam primetio. I ovako koristim event loop koji QThread od neke verzije ispred podržava.
Prijavi uredniku   Sačuvana
Stranice: [1]   Idi gore
  Štampaj  
 
Prebaci se na: