खोज…


टिप्पणियों

जबकि Qt फ्रेमवर्क के कुछ हिस्से थ्रेड सुरक्षित हैं, लेकिन इसका अधिकांश हिस्सा नहीं है। क्यूटी सी ++ प्रलेखन एक अच्छा अवलोकन प्रदान करता है कि कौन सी कक्षाएं रीएंन्टेंट हैं (इसका उपयोग कई थ्रेड्स में ऑब्जेक्ट्स को इंस्टेंट करने के लिए किया जा सकता है)। निम्नलिखित नियम सबसे अधिक मांग हैं:

  • आप मुख्य थ्रेड के बाहर से Qt GUI ऑब्जेक्ट बना या एक्सेस नहीं कर सकते हैं (उदाहरण के लिए QWidget या इसी तरह की कोई भी चीज़)।
  • यहां तक कि अगर Qt वर्ग पुनर्व्यवस्थित है, तो आप थ्रेड्स के बीच Qt ऑब्जेक्ट तक पहुँच साझा नहीं कर सकते, जब तक कि उस वर्ग के लिए Qt प्रलेखन स्पष्ट रूप से यह न कहे कि इंस्टेंस थ्रेड सुरक्षित हैं।
  • आप QObject.moveToThread() उपयोग कर सकते हैं यदि आपको एक क्यूटी ऑब्जेक्ट को एक थ्रेड से दूसरे में ले जाने की आवश्यकता है (क्यूटी जीयूआई ऑब्जेक्ट पर लागू नहीं होता है जो हमेशा मुख्य थ्रेड में रहना चाहिए)। लेकिन ध्यान दें कि ऑब्जेक्ट में पैरेंट नहीं होना चाहिए।

इस स्टैक ओवरफ्लो QA के अनुसार, पायथन थ्रेड्स का उपयोग करने की अनुशंसा नहीं की जाती है यदि आपका धागा किसी भी तरह से PyQt के साथ बातचीत करने का इरादा रखता है (भले ही क्यूटी फ्रेमवर्क का वह हिस्सा थ्रेड सुरक्षित हो)।

कार्यकर्ता मॉडल

# this method can be anything and anywhere as long as it is accessible for connection
@pyqtSlot()
def run_on_complete():
   
    pass

# An object containing methods you want to run in a thread
class Worker(QObject):
    complete = pyqtSignal()
    
    @pyqtSlot()
    def a_method_to_run_in_the_thread(self):
        # your code
        
        # Emit the complete signal
        self.complete.emit() 

# instantiate a QThread
thread = QThread()
# Instantiate the worker object
worker = Worker()
# Relocate the Worker object to the thread
worker.moveToThread(thread)
# Connect the 'started' signal of the QThread to the method you wish to run
thread.started.connect(worker.a_method_to_run_in_the_thread)
# connect to the 'complete' signal which the code in the Worker object emits at the end of the method you are running
worker.complete.connect(run_on_complete)
# start the thread (Which will emit the 'started' signal you have previously connected to)
thread.start()


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow