Zoeken…


Opmerkingen

Hoewel sommige delen van het Qt-framework thread-safe zijn, is een groot deel daarvan niet. De Qt C ++ documentatie geeft een goed overzicht van welke klassen terugkomen (kan worden gebruikt om objecten in meerdere threads te instantiëren). De volgende regels worden het meest gezocht:

  • U kunt geen Qt GUI-object maken of openen buiten de QWidget (bijv. Alles dat QWidget of iets dergelijks onderklasseert).
  • Zelfs als de Qt-klasse terugkomt, kunt u de toegang tot een Qt-object niet delen tussen threads, tenzij de Qt-documentatie voor die klasse expliciet vermeldt dat instanties thread-safe zijn.
  • U kunt QObject.moveToThread() als u een Qt-object van de ene thread naar de andere wilt verplaatsen (niet van toepassing op Qt GUI-objecten die altijd in de QObject.moveToThread() moeten blijven). Maar merk op dat het object geen ouder moet hebben.

Volgens deze Stack Overflow QA wordt het niet aanbevolen om Python-threads te gebruiken als uw thread op enige manier met PyQt wil communiceren (zelfs als dat deel van het Qt-framework thread-safe is).

Het arbeidersmodel

# 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow