hilos separados en la aplicación pygtk

Estoy teniendo algunos problemas para enhebrar mi aplicación pyGTK. Le doy tiempo al hilo para que complete su tarea, si hay un problema, simplemente continúo de todas formas pero advierto al usuario. Sin embargo, una vez que continúe, este hilo se detiene hasta que se llama a gtk.main_quit. Esto me está confundiendo.

El código relevante:

class MTP_Connection(threading.Thread): def __init__(self, HOME_DIR, username): self.filename = HOME_DIR + "mtp-dump_" + username threading.Thread.__init__(self) def run(self): #test run for i in range(1, 10): time.sleep(1) print i 

……………………..

 start_time = time.time() conn = MTP_Connection(self.HOME_DIR, self.username) conn.start() progress_bar = ProgressBar(self.tree.get_widget("progressbar"), update_speed=100, pulse_mode=True) while conn.isAlive(): while gtk.events_pending(): gtk.main_iteration() if time.time() - start_time > 5: self.write_info("problems closing connection.") break #after this the program continues normally, but my conn thread stops 

En primer lugar, no threading.Thread . Thread(target=callable).start() , use Thread(target=callable).start() .

En segundo lugar, y probablemente la causa de su bloque aparente es que gtk.main_iteration toma un block parámetros, que por defecto es True , por lo que su llamada a gtk.main_iteration realidad se bloqueará cuando no haya eventos para iterar. Que se puede resolver con:

 gtk.main_iteration(block=False) 

Sin embargo, no hay una explicación real de por qué usaría este bucle pirateado en lugar del bucle principal de gtk. Si ya está ejecutando esto dentro de un bucle principal, entonces sugeriría que está haciendo algo incorrecto. Puedo ampliar sus opciones si nos da un poco más de detalles y / o el ejemplo completo.

En tercer lugar, y esto solo surgió después: siempre siempre siempre asegúrese de haber llamado a gtk.gdk.threads_init en cualquier aplicación de pygtk con subprocesos. GTK + tiene diferentes rutas de código cuando se ejecuta en subprocesos, y necesita saber cómo usarlas.

Escribí un pequeño artículo sobre pygtk e hilos que te ofrece una pequeña abstracción para que nunca tengas que preocuparte por estas cosas. Esa publicación también incluye un ejemplo de barra de progreso.