ホームページ  >  記事  >  バックエンド開発  >  PyQt のメイン ウィンドウとスレッド間でデータを安全に通信するにはどうすればよいですか?

PyQt のメイン ウィンドウとスレッド間でデータを安全に通信するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 12:50:15401ブラウズ

How can I safely communicate data between the main window and a thread in PyQt?

メイン ウィンドウと PyQt のスレッド間でのデータの通信

PyQt アプリケーションでは、一般的なシナリオとして、メイン ウィンドウとスレッドの間でデータを共有することが含まれます。スレッドの安全性を維持しながらスレッドを実行します。推奨されるアプローチは次のとおりです:

シグナルとスロット:

  • スレッド クラスでカスタム Qt シグナルを宣言します (例: beep())。
  • メイン ウィンドウのシグナルを、update() などの関連するウィジェットを更新するスロットに接続します。

例:

<code class="python">class Worker(QtCore.QThread):
    beep = QtCore.pyqtSignal(int)

    def __init__(self, sleep_time):
        super(Worker, self).__init__()
        self.sleep_time = sleep_time

    def run(self):
        i = 0
        while True:
            i += 1
            self.beep.emit(i)
            time.sleep(self.sleep_time)

class MainWindow(QtGui.QWidget):
    def __init__(self):
        # ...
        self.worker = Worker(1)  # Initial sleep time
        self.worker.beep.connect(self.update)
        self.worker.start()

    def update(self, number):
        # Update widget with number
        self.output.display(number)</code>

注意事項:

  • Qt ウィジェットはスレッドセーフではないため、メイン スレッドからのみアクセスする必要があります。
  • グローバル変数は、アクセス時に期待どおりに動作しない可能性があります

その他のアプローチ:

  • ホストウィンドウの参照: QObject スレッドのアフィニティに依存するため危険
  • 同期コピーの維持: メイン ウィンドウとスレッド間の一貫性を維持する必要があり、これは複雑になる可能性があります。

以上がPyQt のメイン ウィンドウとスレッド間でデータを安全に通信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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