2013-03-29 9 views
11

Ho problemi con QThreads in python. Voglio cambiare il colore di sfondo dell'etichetta. Ma la mia applicazione si è bloccata durante l'avvio. "QThread: distrutto mentre discussione è ancora in esecuzione"QThread: Distrutto mentre il thread è ancora in esecuzione

class MainWindow(QMainWindow): 
     def __init__(self): 
      QMainWindow.__init__(self) 
      self.ui = Ui_MainWindow() 
      self.ui.setupUi(self) 

      statusTh = statusThread(self) 
      self.connect(statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection) 
      statusTh.start() 

     def st(self): 
      if self.status == 'ON': 
       self.ui.label.setStyleSheet('background-color:green') 
      else: 
       self.ui.label.setStyleSheet('background-color:red') 

    class statusThread(QThread): 
     def __init__(self, mw): 
      super(statusThread, self).__init__() 

     def run(self): 
      while True: 
       time.sleep(1) 
       self.emit(SIGNAL('setStatus')) 

    if __name__ == "__main__": 
     app = QApplication(sys.argv) 
     main_window = MainWindow() 
     main_window.show() 
     sys.exit(app.exec_()) 
+0

Una soluzione in stile Qt, assegnare finestra principale, come 'genitore di statusTh', vale a dire,' super (statusThread, auto) .__ init __ (mw) '. – nymk

+0

Grazie mille. Funziona ora –

+0

Solo per informazione, questa è fondamentalmente la stessa cosa: in questo caso il genitore manterrà il riferimento all'istanza del thread e quindi non sarà raccolto. – rainer

risposta

20

Lei non è la memorizzazione di un riferimento al thread dopo che è stato creato, il che significa che sarà garbage collection (cioè distrutta.) Qualche tempo dopo la il programma parte MainWindow s __init__. È necessario memorizzare almeno fino a quando il filo è in funzione, per esempio, utilizzare self.statusTh:

self.statusTh = statusThread(self) 
self.connect(self.statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection) 
self.statusTh.start() 
+0

Scusate, sono novizio in Python. Non riesco a capire Come posso avere bisogno di memorizzare il riferimento? –

+5

Proprio come ho scritto nella mia risposta. Assegnando l'istanza di 'statusThread (self)' a una variabile locale (cioè senza 'self' di fronte ad essa), sarà garbage collection quando la variabile locale esce dallo scope (cosa che fa quando' __init__' di 'MainWindow' è finito). Se si memorizza il riferimento in una variabile membro della classe 'MainWindow' (cioè con' self' davanti a sé), esso non uscirà dall'ambito quando è fatto '__init__', risultando che l'oggetto thread non è raccolta dei rifiuti – rainer

+0

darei 10 voti positivi! Bella risposta - mi ha salvato un sacco di tempo e dolore! Penso che dovresti spostare anche il testo del commento nella risposta. –

Problemi correlati