Pregunta

Estoy teniendo algunos problemas de roscado mi solicitud pyGTK. Doy el hilo un poco de tiempo para completar su tarea, si hay un problema que acabo de continuar de todos modos, pero avisar al usuario. Sin embargo una vez de continuar, este hilo se detiene hasta Gtk.main_quit se llama. 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
¿Fue útil?

Solución

primer lugar, no threading.Thread subclase, uso Thread(target=callable).start().

En segundo lugar, y probablemente la causa de su bloque evidente es que gtk.main_iteration toma un parámetro block, que por defecto es True, por lo que su llamada a gtk.main_iteration en realidad bloquear cuando no hay eventos para iterar sobre. Que puede ser resuelto con:

gtk.main_iteration(block=False)

Sin embargo, no hay una explicación real de por qué se usaría este bucle hackeado más que el bucle principal de GTK real. Si ya está ejecutando esto dentro de un bucle principal, entonces yo sugeriría que usted está haciendo las cosas mal. Puedo ampliar sus opciones si usted nos da un poco más de detalle y / o el ejemplo completo.

En tercer lugar, y esto sólo ocurrió después: Siempre Siempre siempre siempre asegúrese de que ha llamado gtk.gdk.threads_init en cualquier aplicación pygtk con hilos. GTK + tiene diferentes rutas de código cuando se ejecuta roscado, y necesita saber para utilizar estos.

un pequeño artículo sobre pygtk y los hilos que le ofrece una pequeña abstracción para que nunca tenga que preocuparse de estas cosas. Ese puesto también incluye un ejemplo barra de progreso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top