ホームページ >バックエンド開発 >Python チュートリアル >PyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?
PyQt のメイン ウィンドウとスレッド間でのデータの共有
マルチスレッド アプリケーションでは、多くの場合、メイン ウィンドウのスレッドとワーカー スレッドの間でデータを共有する必要があります。スレッドセーフと適切な通信を確保するために、PyQt はいくつかの実用的なアプローチを提供します。
オプション 1: メイン ウィンドウへの直接参照
このアプローチでは、メイン ウィンドウへの参照ウィンドウがスレッドに渡されます。その後、スレッドはスピンボックスの値など、メイン ウィンドウ内のデータに直接アクセスできるようになります。
<code class="python">class MainWindow(QtGui.QWidget): def __init__(self): # ... self.worker = Worker(self) # ... class Worker(QtCore.QThread): def __init__(self, host_window): super(Worker, self).__init__() self.host = host_window # ...</code>
オプション 2: シグナルとスロット
PyQt は使用しますオブジェクト間で通信するための信号とスロット。このアプローチでは、データが変更されたときにワーカー スレッドがシグナルを発行し、メイン ウィンドウ スロット関数が更新を処理します。
<code class="python">class MainWindow(QtGui.QWidget): def __init__(self): # ... self.worker = Worker() self.worker.beep.connect(self.update) # ... class Worker(QtCore.QThread): beep = QtCore.pyqtSignal(int) def __init__(self): super(Worker, self).__init__() # ...</code>
どのオプションを使用しますか?
選択はスレッドのニーズと必要な制御レベルによって異なります。
スレッドの安全性に関する考慮事項
ウィジェットは次のとおりです。スレッドセーフではありません。したがって、シグナルとスロットを使用してスレッドとメイン ウィンドウ間の通信を処理することが重要です。複数のスレッドからウィジェットを直接操作すると、予期しない動作が発生する可能性があります。
以上がPyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。