2013-03-29 22 views
11

私はPythonでQThreadsに問題があります。私はラベルの背景色を変更したい。 しかし、起動中にアプリケーションがクラッシュします。 「QThread:スレッドがまだ実行されている間デストロイ」QThread:スレッドがまだ実行中に破棄されました

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

Qtのスタイルのソリューション、statusTh'の親、つまり、 'スーパー(statusThread、'としてメインウィンドウを割り当てます自己).__ init __(mw) '。 – nymk

+0

多くのことがあります。それは今働いています –

+0

ちょうど情報については、これは基本的に同じことです:この場合、親はスレッドインスタンスへの参照を保持し、したがってガベージコレクションされません。 – rainer

答えて

20

あなたはそれが後のごみ収集(。つまり、破壊された)いくつかの時間になることを意味し、それが作成されていた後、スレッドへの参照を格納していませんプログラムはMainWindow__init__になります。あなたは、例えばself.statusThを使用し、少なくとも限り、スレッドが実行されているとして、それを格納する必要があります。

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

申し訳ありませんが、私はPythonの初心者です。理解できません。参照を保存するにはどうすればよいですか? –

+5

私の答えに書いたとおりです。 'statusThread(self)'のインスタンスをローカル変数(つまり、 'self.'を付けずに)に代入すると、ローカル変数がスコープから外れたときにガベージコレクトされます(' __init__' 'MainWindow'の終了です)。リファレンスを 'MainWindow'クラスのメンバ変数(つまり、' self.'を前につけて)に格納すると、 '__init__'が実行されたときスコープから外れてスレッドオブジェクトが存在しなくなりますガベージコレクション。 – rainer

+0

私は10アップフォートを与えるだろう!素敵な答え - 私に多くの時間と悲しみを救った!私は、あなたも答えにコメントテキストを移動する必要がありますと思います。 –

関連する問題