2009-11-25 3 views
6

Sto scrivendo un programma da un framework usando pygtk. Il programma principale di fare le seguenti cose:Python, thread e gobject

  1. creare un thread di watchdog per monitorare una risorsa
  2. Creare un client per ricevere i dati da presa
  3. chiamata gobject.Mainloop()

ma sembra dopo il mio programma inserisci il Mainloop, anche il thread del watchdog non funzionerà.

La soluzione alternativa è utilizzare gobject.timeout_add per eseguire la cosa del monitor.

Ma perché la creazione di un altro thread non funziona?

Ecco il mio codice:

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() 

L'output del programma unico "Watchdog running ... Inserisci mainloop ..", poi più nulla. Sembra che il thread non funzioni mai dopo aver inserito mainloop.

+1

Cos'altro ti aspetti? Con il codice sopra, mi aspetto che queste due cose vengano stampate una volta ciascuna. – u0b34a0f6ae

risposta

9

Puoi pubblicare un po 'di codice? Potrebbe essere che tu abbia problemi con lo Global Interpreter Lock.

Your problem solved by someone else :). Potrei copiare e incollare qui l'articolo, ma in breve i thread c-thread di gtk si scontrano con i thread di Python. È necessario disabilitare c-thread chiamando gobject.threads_init() e tutti dovrebbero andare bene.

+0

Grazie, aggiungo qualche frammento di codice, qualcosa di sbagliato con questo codice? –

+0

Capito. Grazie per l'informazione. –

+2

Sono felice che tu abbia aggiunto un breve suggerimento nella risposta dato che il link è morto. – vidstige

2

Non è stato possibile inizializzare i percorsi di codice basati su thread in gtk.

È necessario ricordare due cose quando utilizzando le discussioni con PyGTK:

  1. GTK thread deve essere inizializzato con gtk.gdk.threads_init:

Da http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html, diritti d'autore interamente mantenute per autore Questa nota sul copyright non deve essere rimossa.

Si può pensare a glib/gobject invece di pygtk, è la stessa cosa.

+0

Grazie, sono uscito nuovo in GTK. L'informazione aiuta. –