2013-03-29 15 views
11

çalışırken Tahrip. Etiketin arka plan rengini değiştirmek istiyorum. Ancak Başlatma sırasında uygulama çökmem. "QThread: iplik hala çalışırken tahrip"QThread: iplik hala Python qthreads ile sorun yaşıyorum

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

bir Qt tarzı bir çözüm, statusTh' ebeveyni 'ana pencere atamak, yani' süper (statusThread, öz) .__ init __ (mw) '. – nymk

+0

Thanx çok. Şu anda –

+0

çalışıyor Sadece bilgi için, bu temelde aynı şeydir: bu durumda, ebeveyn iş parçacığı örneğine referans tutacaktır ve bu nedenle çöp toplanmayacaktır. – rainer

cevap

20

Bunu sonra çöp toplandı (. Yani tahrip) biraz zaman olacağı anlamına gelir oluşturulduktan geçirildikten sonra iplik, bir başvuru depolamak değiliz program MainWindow s __init__'dan ayrılır. En az sürece iplik çalıştığı şeklinde depolamaları gerekir, örneğin self.statusTh kullanın:

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

Üzgünüz, Python'da acemiyim. Anlayamıyorum. Referansı nasıl saklayabilirim? –

+5

Sadece cevabımda yazdığım gibi. 'StatusThread (self)' örneğini bir yerel değişkene atayarak (yani, kendi önünde 'self.' olmadan), yerel değişken kapsam dışına çıktığında toplanan çöp olacaktır (__init__' olduğunda 'MainWindow' bitti). Referansı, "MainWindow" sınıfının bir üye değişkeni içinde saklıyorsanız (yani, 'self.' ile önündeki),' __init__' yapıldığında kapsam dışı kalmayacaktır, bu da thread nesnesinin olmamasına neden olur. çöp toplandı. – rainer

+0

10 tane hediye verecektim! Güzel cevap - bana çok zaman ve keder kurtardı! Yorum metnini de cevaba taşımalısınız. –

İlgili konular