pyqt
PyQt에서 쓰레드 사용하기
수색…
비고
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