[Tech] thread e gtktext
Szymon Stefanek
pragma@firenze.linux.it
Sab 28 Giu 2003 04:31:43 CEST
On Friday 27 June 2003 16:44, Rannm wrote:
> Salve tutti
> io ho un grosso problema con l'uso del gtk_text in un thread
> [...]
> Come è possibile che quando eseguo il programma
> tutto funziona e se apro altri programmi che non hanno
> un gtktext all'interno funziona benissimo
> ma nel momento in cui apro ad esempio il gedit e faccio
> una ricerca oppure vado col tasto in giù per visulizzare il
> testo mi muere il thread.
"Muore il thread" in che senso ? SEGV oppure si "pianta" ?
Sarebbe interessante capire dove si pianta esattamente dentro gtk.
Lo puoi vedere usando gdb:
- Compili il tuo programma con lo switch -g del compilatore e del linker
- Ti assicuri di avere una gtk compilata con la stessa opzione (probabilmente
il ./configure di gtk accetta un opzione del tipo --enable-debug).
- Lanci il tuo programma via gdb:
gdb tuoproggie
(gdb) run
- Se segfaulta , semplicemente aspetti che lo faccia altrimenti lo fai "piantare"
e premi CTRL+C (sigstop)
- Con il comando "bt" vedi lo stack del thread corrente. Se non è il thread
che interessa , usi "info threads" e "thread <numero>" per switchare
context nel thread desiderato.
In questo modo puoi "realizzare" dove è esattamente il problema.
Cmq "a naso" , gtktext non è thread safe (come del resto praticamente ogni altro
widget in ogni altro toolkit :D). In generale , X non è thread safe (anche se lo hai compilato
con la fantomatica opzione che abilita i threads): non puoi comunicare
con il server X inviando dati da due thread separati.
La soluzione che di solito si adotta è quella di inviare i dati dal thread "schiavetto" al thread principale
con un qualche "mezzo interno" che eviti di "toccare" X: ad esempio accodandoli ad una lista di strutture protetta da un mutex.
Il thread principale processerà i dati togliendoli dalla coda nel SUO contesto di esecuzione
(in modo asincrono) e provvederà alla sicura interazione con il server X.
Le implementazioni asincrone sono sostanzialmente due:
- il thread principale ha un timer che periodicamente processa la coda dei messaggi
- il thread principale fa il polling di una "pipe" nella quale il thread schiavetto scrive un byte
ogni volta che emette un gruppo di messaggi.
Szymon Stefanek
>
>
>
>
>
> _______________________________________________
> FLUG - Discussioni tecniche - tech@firenze.linux.it
> URL: http://lists.firenze.linux.it/mailman/listinfo/tech
> Archivio: http://lists.firenze.linux.it/pipermail/tech
> Ricerca nell'archivio: http://www.firenze.linux.it/search
Maggiori informazioni sulla lista
flug-tech