hilos separados en aplicación pygtk
-
22-08-2019 - |
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
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.