수색…


비고

Qt 프레임 워크의 일부는 스레드로부터 안전하지만, 대부분은 그렇지 않습니다. Qt C ++ 문서 는 재진입 가능한 클래스에 대한 개요를 제공합니다 (여러 스레드에서 객체를 인스턴스화하는 데 사용할 수 있음). 다음과 같은 규칙이 가장 많이 요구됩니다.

  • 주 스레드 외부에서 Qt GUI 개체를 만들거나 액세스 할 수 없습니다 (예 : QWidget 또는 그와 유사한 하위 개체).
  • Qt 클래스가 재진입 인 경우에도 해당 클래스의 Qt 문서에서 인스턴스가 스레드로부터 안전하다고 명시하지 않는 한 스레드간에 Qt 객체에 대한 액세스를 공유 할 수 없습니다.
  • 한 스레드에서 다른 스레드로 Qt 객체를 이동해야하는 경우 QObject.moveToThread() 사용할 수 있습니다 QObject.moveToThread() Qt GUI 객체는 항상 주 스레드에 남아 있어야 함). 그러나 객체에는 부모가 없어야합니다.

Stack Overflow QA에 따르면, 스레드가 PyQt와 어떤 방식 으로든 상호 작용하려는 경우 (Qt 프레임 워크의 해당 부분이 스레드로부터 안전하더라도) Python 스레드를 사용하지 않는 것이 좋습니다.

작업자 모델

# 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