Suche…


Bemerkungen

Während einige Teile des Qt-Frameworks Thread-sicher sind, ist vieles nicht der Fall. Die Qt C ++ - Dokumentation bietet einen guten Überblick darüber, welche Klassen wiedereintrittsfähig sind (um Objekte in mehreren Threads zu instanziieren). Folgende Regeln werden am häufigsten gesucht:

  • Sie können ein Qt-GUI-Objekt nicht außerhalb des Hauptthreads erstellen oder darauf zugreifen (z. B. irgendetwas der Unterklasse QWidget oder ähnliches).
  • Selbst wenn die Qt-Klasse wiedereintrittsfähig ist, können Sie den Zugriff auf ein Qt-Objekt nicht zwischen Threads freigeben, es sei denn, die Qt-Dokumentation für diese Klasse gibt explizit an, dass Instanzen threadsicher sind.
  • Sie können QObject.moveToThread() wenn Sie ein Qt-Objekt von einem Thread in einen anderen verschieben müssen (gilt nicht für Qt-GUI-Objekte, die immer im Hauptthread verbleiben müssen). Beachten Sie jedoch, dass das Objekt kein übergeordnetes Element haben darf.

In diesem Stack Overflow-QA wird die Verwendung von Python-Threads nicht empfohlen, wenn Ihr Thread beabsichtigt, mit PyQt auf irgendeine Weise zu interagieren (selbst wenn dieser Teil des Qt-Frameworks threadsicher ist).

Das Arbeitermodell

# 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow