pyqt
PyQtでのスレッドの使用
サーチ…
備考
Qtフレームワークの一部はスレッドセーフですが、その多くはスレッドセーフではありません。 Qt C ++のドキュメントでは、どのクラスがリエントラントなのかをよく理解しています(複数のスレッドでオブジェクトをインスタンス化するために使用できます)。以下のルールが最も広く求められています。
- Qt GUIオブジェクトを作成したり、メインスレッドの外側からアクセスすることはできません(
QWidget
などをサブクラス化するもの)。 - 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