pygtk threads y segmentation fault

Daniel Garcia Moreno dani en danigm.net
Lun Nov 24 13:38:12 CET 2008


El sáb, 22-11-2008 a las 23:44 +0100, lasizoillo escribió:
> 2008/11/22 Daniel Garcia Moreno <dani en danigm.net>:
> > Hola a todos, tengo una aplicación en pygtk que hace una llamada
> > bloqueante a un servicio xmlrpc y para que no se quede colgado mientras
> > tanto, hago esta llamada en un thread.
> >
> > Es bien sabido que pygtk no se lleva muy bien con los threads y por eso
> > me he mirado la faq [1] de pygtk y he rodeado el código dentro del
> > thread con gtk.gdk.threads_enter()/gtk.gdk.threads_leave(), pero me
> > sigue fallando la aplicación de forma aleatoria.
> >
> 
> Yo no lo sabía, pero bueno es saberlo.
> 
> Alguien sabe que tal funciona el reactor de twisted con gtk (u otros).
> Estoy barajando hacer un cliente pesado que haga cosas en red y ya
> tengo una parte implementada en twisted (el server y algunos clientes
> de prueba).
> 
> > Si alguien quiere probar la aplicación puede descargarla con bzr [2]:
> > bzr branch http://repo.danigm.net/sweetgtk
> > Falla al pulsar alternativamente los botones home e index de forma
> > rápida, o al inicio, que es cuando se llama al thread.
> >
> 
> No me funciona la url. ¿Está bien escrita?
> 

Ya he solucionado el problema, qué hay que hacer?

llamar al método gtk.gdk.threads_init() cuanto antes:
import gtk
gtk.gdk.threads_init()

Dentro del thread rodear cada llamada a cualquier función de gtk de
gtk.thread_enter()/gtk.thread_leave(), y cuidado de no rodear con esto
la llamada bloqueante, porque sino se seguirá quedando bloqueado.

class hilo(threading.Thread):
	def __init__(self, widget):
		self.widget = widget
	
	def run(self):
		try:
			gtk.thread_enter()
			self.widget.show()
		finally:
			gtk.thread_leave()

		# cosa bloqueante
		time.sleep(30)

		try:
			gtk.thread_enter()
			self.widget.hide()
		finally:
			gtk.thread_leave()
	
Y con esto funciona bien, no se bloquea y se ejecutan las cosas según el
orden.

------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es