「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?

PyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?

2024 年 11 月 6 日に公開
ブラウズ:362

How to Share Data Between the Main Window and Threads in PyQt: Direct Reference vs. Signals and Slots?

PyQt のメイン ウィンドウとスレッド間のデータの共有

マルチスレッド アプリケーションでは、多くの場合、メイン ウィンドウのスレッドとワーカー スレッドの間でデータを共有する必要があります。スレッドの安全性と適切な通信を確保するために、PyQt はいくつかの実用的なアプローチを提供します。

オプション 1: メイン ウィンドウへの直接参照

このアプローチでは、メイン ウィンドウへの参照が必要になります。ウィンドウがスレッドに渡されます。その後、スレッドはスピンボックスの値など、メイン ウィンドウ内のデータに直接アクセスできるようになります。

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
        # ...

オプション 2: シグナルとスロット

PyQt はオブジェクト間の通信にシグナルとスロットを使用します。このアプローチでは、データが変更されたときにワーカー スレッドがシグナルを発行し、メイン ウィンドウ スロット関数が更新を処理します。

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__()
        # ...

どのオプションを使用しますか?

選択は、スレッドのニーズと必要な制御レベルによって異なります。

  • オプション 1 はメイン ウィンドウ データへの直接アクセスを提供しますが、より複雑なデータ共有には拡張性が劣る可能性があります。
  • オプション 2 はスレッド セーフを確保し、より柔軟な通信をサポートします。 pattern.

スレッドの安全性に関する考慮事項

ウィジェットはスレッドセーフではありません。したがって、シグナルとスロットを使用してスレッドとメイン ウィンドウ間の通信を処理することが重要です。複数のスレッドからウィジェットを直接操作すると、予期しない動作が発生する可能性があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3