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