2009-11-25 15 views
6

Estoy escribiendo un programa por un framework usando pygtk. El principal programa de hacer las siguientes cosas:Python, thread y gobject

  1. Crear un hilo de vigilancia para monitorear algún recurso
  2. Crear un cliente para recibir los datos de toma
  3. llamada gobject.Mainloop()

pero parece que después de mi programa ingrese a Mainloop, el hilo de vigilancia tampoco se ejecutará.

Mi solución consiste en utilizar gobject.timeout_add para ejecutar el monitor.

¿Pero por qué no funciona la creación de otro hilo?

Aquí está mi código:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

La salida del programa único "Watchdog correr ... Introduzca mainloop ..", entonces nada. Parece que el hilo nunca se ejecuta después de ingresar al lazo principal.

+1

¿Qué más esperas? Con el código anterior, espero que esas dos cosas se impriman una vez cada una. – u0b34a0f6ae

Respuesta

9

¿Se puede publicar algún código? Podría ser que tenga problemas con el Global Interpreter Lock.

Your problem solved by someone else :). Podría copiar y pegar el artículo aquí, pero en resumen los c-hilos de gtk chocan con los hilos de Python. Necesita deshabilitar c-hilos al llamar a gobject.threads_init() y todo debería estar bien.

+0

Gracias, agrego algún fragmento de código, ¿hay algún error con este código? –

+0

Lo tengo. Gracias por la información. –

+2

Me complace que haya agregado una breve sugerencia en la respuesta ya que el enlace está ahora muerto. – vidstige

2

Error al inicializar las rutas de código basadas en subprocesos en gtk.

Usted debe recordar dos cosas cuando utilizando hilos con PyGTK:

  1. GTK roscas deben ser inicializado con gtk.gdk.threads_init:

De http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, los derechos de autor retenidas en su totalidad por autor Este aviso de derechos de autor no debe ser eliminado.

Puedes pensar glib/gobject en lugar de pygtk, es lo mismo.

+0

Gracias, soy nuevo en GTK. La información ayuda. –

Cuestiones relacionadas