Поиск…


замечания

Хотя некоторые части структуры Qt являются потокобезопасными, большая часть из них не является. Документация Qt C ++ дает хороший обзор того, какие классы являются реентерабельными (их можно использовать для создания объектов в нескольких потоках). Наиболее распространенными являются следующие правила:

  • Вы не можете создать или получить доступ к объекту Qt GUI извне основного потока (например, все, что подклассы QWidget или аналогичные).
  • Даже если класс Qt является реентерабельным, вы не можете предоставить доступ к объекту Qt между потоками, если только в документации Qt для этого класса явно не указано, что экземпляры являются потокобезопасными.
  • Вы можете использовать QObject.moveToThread() если вам нужно переместить объект Qt из одного потока в другой (не относится к объектам GUI Qt, которые всегда должны оставаться в основном потоке). Но обратите внимание, что объект не должен иметь родителя.

В соответствии с этим контролем качества стека не рекомендуется использовать потоки Python, если ваш поток намеревается каким-либо образом взаимодействовать с PyQt (даже если эта часть оболочки Qt является потокобезопасной).

Модель рабочего

# 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