Sök…


Anmärkningar

Vissa delar av Qt-ramverket är trådsäker, men mycket av det är det inte. Qt C ++ -dokumentationen ger en bra översikt över vilka klasser som är reentranta- rande (kan användas för att instansera objekt i flera trådar). Följande regler är de mest sökta:

  • Du kan inte skapa eller få åtkomst till ett Qt GUI-objekt utanför huvudtråden (t.ex. något som underklasserar QWidget eller liknande).
  • Även om Qt-klassen är reentrant kan du inte dela åtkomst till ett Qt-objekt mellan trådar om inte Qt-dokumentationen för den klassen uttryckligen säger att instanser är trådsäkra.
  • Du kan använda QObject.moveToThread() om du behöver flytta ett Qt-objekt från en tråd till en annan (gäller inte Qt GUI-objekt som alltid måste förbli i huvudtråden). Men observera att objektet inte får ha en förälder.

Enligt denna Stack Overflow QA, rekommenderas det inte att använda Python-trådar om din tråd avser att interagera med PyQt på något sätt (även om den delen av Qt-ramverket är trådsäker).

Arbetarmodellen

# 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow