2009-05-01 10 views
5

Tengo un problema con hilos en pygtk. Mi aplicación consiste en un programa que descarga imágenes de Internet y luego las muestra con pygtk. El problema es que para hacer esto y mantener la GUI en buen estado, necesito usar hilos.Cómo trabajar con hilos en pygtk

Recibí una devolución de llamada después de que el usuario hizo clic en el botón "Descargar imágenes" y llamé al método para descargar las imágenes que están dentro de esa misma clase.

thread.start_new_thread (self.images_download, (path, páginas)

Esto no funcionará. La única manera de obtener mi programa para entrar en el hilo es mediante el uso de

gtk.threads_init ()

Antes de comenzar cualquier hilo. Ahora que descarga las fotos, pero la interfaz gráfica de usuario sigue sin responder. googled esto y traté de poner gtk.threads_enter y gtk.threads_leave alrededor de las roscas, pero simplemente no funciona.

Respuesta

12

Su pregunta es un poco vaga, y sin una referencia a su código real es difícil especular sobre lo que está haciendo mal.

Así que les daré algunos consejos para leer, luego especulan salvajemente según la experiencia.

En primer lugar, pareces pensar que solo puedes mantener la GUI en buen estado mediante el uso de subprocesos. Esto no es verdad. También puede escribir su código de forma asincrónica y hacer todo en una aplicación de subproceso único. Twisted se basa en este modelo de programación. Hace poco made a blog post que explica cómo creé una interfaz de tarea asíncrona y ejemplos de corredores para CLI y GTK +. Puede ver esos ejemplos para ver cómo las tareas pueden implementarse de forma asíncrona, y la interfaz de usuario aún se actualiza.

En segundo lugar, si prefiere usar subprocesos por algún motivo, deberá comprender un poco el modelo de subprocesamiento GTK +.

Debe comenzar por leer The PyGTK FAQ entry on the subject, y puede encontrar this blog post fácil de entender también.

Ahora, a la especulación. Supongo que está intentando actualizar su interfaz de usuario de GTK a partir del hilo, y no manipular el bloqueo correctamente. Si este es el caso, es mejor por ahora aplazar todas las actualizaciones de UI que desee hacer desde los hilos al hilo principal mediante gobject.idle_add() De esta manera, todas las llamadas de IU se realizarán desde el hilo principal. Es un modelo mental más fácil de seguir en su programación.

vez que se sienta realmente entender la rosca y modelos de bloqueo, se podría considerar la actualización de la interfaz de usuario de sus hilos, pero es fácil que se pierda una threads_enter()/threads_leave()

+0

+1: No use hilos, solo use E/S asincrónicas. – nosklo

1

Puede utilizar gtk.gdk. threads_init() para permitir que cualquier subproceso modifique la UI con el respectivo bloqueo gtk.gdk.threads_enter() y gtk.gdk.theads_leave(), pero el problema con esto es que no funciona bien en Windows. Lo he probado en Linux y funciona bastante bien, pero no tuve suerte haciendo que esto funcione en win32.

=== === Editar

He estado navegando sobre esto, se podía hacer uso de la gobject.io_add_watch para comprobar si hay algo en su zócalo, agarrarlo y luego actualizar la interfaz gráfica de usuario.revise mi publicación sobre esto: Sockets (and some other files) and PyGTK without threads.