2011-05-23 24 views
7

Quiero jugar con los errores de hilo con PyGTK. Tengo este código hasta ahora:PyGTK bloqueando hilos no GUI

#!/usr/bin/python 

import pygtk 
pygtk.require('2.0') 
import gtk 
import threading 
from time import sleep 

class SomeNonGUIThread(threading.Thread): 
    def __init__(self, tid): 
     super(SomeNonGUIThread, self).__init__() 
     self.tid = tid 

    def run(self): 
     while True: 
      print "Client #%d" % self.tid 
      sleep(0.5) 

class App(threading.Thread): 
    def __init__(self): 
     super(App, self).__init__() 

     self.window = gtk.Window() 
     self.window.set_size_request(300, 300) 
     self.window.set_position(gtk.WIN_POS_CENTER) 
     self.window.connect('destroy', gtk.main_quit) 

     self.window.show_all() 

    def run(self): 
     print "Main start" 
     gtk.main() 
     print "Main end" 


if __name__ == "__main__": 
    app = App() 

    threads = [] 
    for i in range(5): 
     t = SomeNonGUIThread(i) 
     threads.append(t) 

    # Ready, set, go! 
    for t in threads: 
     t.start() 

    # Threads work so well so far 
    sleep(3) 

    # And now, they freeze :-(
    app.start() 

Lo hace NonGUIThreads se están ejecutando durante 3 segundos concurently. Después, se muestra la ventana y otros hilos son stoped! Después de cerrar la ventana, los hilos se están ejecutando nuevamente.

¿Cómo es posible que gtk.main() sea capaz de bloquear otros hilos? Los hilos no dependen de ningún bloqueo, por lo que deberían funcionar durante la ventana que se muestra.

Respuesta

5

Tienes que llamar al gobject.threads_init() antes de hacer cualquier cosa relacionada con Gtk.

More info in PyGtk's FAQ

+0

¡Gracias por su respuesta! Encontré esa página pero pensé que era solo para situaciones en las que los hilos quieren comunicarse con GTK. Estaba equivocado. – izidor