ホームページ  >  記事  >  バックエンド開発  >  PyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 00:40:30868ブラウズ

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

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>

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

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

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

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

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

以上がPyQt のメイン ウィンドウとスレッド間でデータを共有する方法: 直接参照 vs. シグナルとスロット?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。