2013-03-29 12 views
11

मुझे पायथन में QThreads के साथ समस्या हो रही है। मैं लेबल के पृष्ठभूमि रंग को बदलना चाहता हूं। लेकिन शुरू होने पर मेरा एप्लिकेशन क्रैश। "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

एक क्यूटी शैली समाधान, 'के रूप में statusTh' की मूल मुख्य विंडो असाइन करते हैं, अर्थात्,' सुपर (statusThread, स्वयं) .__ init __ (मेगावाट) '। – nymk

+0

Thanx बहुत कुछ। यह अब काम कर रहा है –

+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

क्षमा करें, मैं पाइथन में नौसिखिया हूँ। मैं समझ नहीं पा रहा हूँ मुझे संदर्भ को स्टोर करने की आवश्यकता कैसे हो सकती है? –

+5

जैसा कि मैंने अपने उत्तर में लिखा था। स्थानीय चर ('बिना' स्वयं 'के बिना' स्टेटस थ्रेड (स्वयं) 'के उदाहरण को असाइन करके, यह स्थानीय चर के दायरे से बाहर हो जाने पर कचरा इकट्ठा किया जाएगा (जो यह करता है कि' __init__' 'मेनविंडो' समाप्त हो गया है)। यदि आप 'मेनविंडो' वर्ग (यानी 'इसके सामने' स्वयं 'के सदस्य चर के संदर्भ में संदर्भ संग्रहीत करते हैं, तो यह '__init__' होने पर दायरे से बाहर नहीं होगा, जिसके परिणामस्वरूप थ्रेड ऑब्जेक्ट नहीं होता है कचरा इकट्ठा – rainer

+0

मैं 10 अपवॉट दे दूंगा! अच्छा जवाब - मुझे बहुत समय और दुःख बचाया! मुझे लगता है कि आपको टिप्पणी टेक्स्ट को उत्तर में भी ले जाना चाहिए। –

संबंधित मुद्दे