「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PyQt スレッドとメイン ウィンドウ間でデータを安全かつ効率的に共有するにはどうすればよいですか?

PyQt スレッドとメイン ウィンドウ間でデータを安全かつ効率的に共有するにはどうすればよいですか?

2024 年 11 月 1 日に公開
ブラウズ:317

How can I safely and efficiently share data between a PyQt thread and the main window?

PyQt アプリケーションのメイン ウィンドウとスレッド間のデータの共有

スレッドは、メイン ウィンドウをブロックせずにタスクを実行するのに役立ちます。ただし、スレッド内のメイン ウィンドウからデータにアクセスすることには課題が伴います。 PyQt を使用したデータ共有の適切な方法を見てみましょう。

非効率な方法:

1。ウィンドウ参照をスレッドに渡す:
これにより、メイン ウィンドウ変数に直接アクセスできますが、スレッド セーフティの原則に違反します。ウィジェットは再入可能ではないため、メイン スレッドからのみアクセスする必要があります。

2.スレッド同期変数コピーの維持:
この方法では頻繁なデータ同期が必要となり、コードが複雑になり、潜在的な競合状態が発生します。

3.グローバル変数の使用:
マルチスレッド環境ではグローバル変数は推奨されません。同時にアクセスすると、予期しない結果が生じる可能性があります。

推奨される方法:

シグナルとスロットの使用:
これは PyQt で推奨されるアプローチです。シグナルとスロットは、スレッド間の通信にスレッドセーフなメカニズムを提供します。次の手順は、データ共有に信号とスロットを使用する方法の概要を示しています。

1.ワーカー スレッドでシグナルを作成:

# in worker thread
class Worker(QtCore.QThread):
    ...
    # Create signal named "beep"
    beep = QtCore.pyqtSignal(int)

2.ワーカー スレッドからシグナルを送信:

# in worker thread
def run(self):
    ...
    # emit "beep" signal with current count
    self.beep.emit(count)

3.メイン ウィンドウでスロットを信号に接続:

# in main window
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update)  # update槽函数

4.メインウィンドウにスロット機能を実装:

# in main window
def update(self, count):
    ...
    # update GUI elements using count

5 を使用して GUI 要素を更新します。メイン ウィンドウから共有データを更新:メイン ウィンドウの

# in main window
self.spinbox.valueChanged.connect(self.worker.update_value)  # update_value槽函数

6.ワーカー スレッドにスロット関数を実装:

# in worker thread
class Worker:
    ...
    def update_value(self, value):
        # Update sleep time in worker thread

これらの手順に従うことで、PyQt アプリケーションのスレッドとメイン ウィンドウ間で安全かつ効率的にデータを共有できます。

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

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

Copyright© 2022 湘ICP备2022001581号-3