[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