2017-05-16 13 views
1

QThreadを使用して別のスレッドで計算を行っています。 ボタンをクリックしてスレッドを開始し、魔女はStartMeasurement()関数を起動します。 スレッドは、(計算が完了した後で)プロセスを終了することができます。 PyqTシグナルが終了します。または、stopBtnをクリックしてスレッドを停止することができます。GUIでQThreadを再起動

terminate()関数は動作していますが、スレッドを再開しようとすると多くの問題が発生します。

ここでmovetoThread()アプローチを使用することをお勧めしますか? または、正しく再起動できるようにスレッドが正しく停止されていることをどうすれば確認できますか。 (手段は、新たに始まる!)

は、スレッド内measurmentを開始します。StartMeasurementを()

def StartMeasurement(self):    

    self.thread = measure.CMeasurementThread(self.osziObj, self.genObj, self.measSetup) 

    self.thread.newSample.connect(self.plotNewSample) 
    self.thread.finished.connect(self.Done) 
    self.stopBtn.clicked.connect(self.thread.terminate) 
    self.stopBtn.clicked.connect(self.Stop) 

    self.thread.start() 

答えて

1

それは問題ではありません。 QThreadを使用する場合の一般的なプラクティスは、そのfinished()信号をmoveToThread()を介して別のスレッドに移動されたオブジェクトのdeleteLater()スロットに接続することです。これは、まずスレッドを終了してそのインスタンスを破棄することを前提としているため、スレッドを破棄するときにメモリを適切に管理するために行われます。 ;)スレッドを止めることは、私が上で説明した接続を確立していない限り、それらのオブジェクトの破壊とは何の関係もありません。

quit()wait()を使用して正常に停止した場合は、スレッドが正常に停止した場合は、実際に停止が完了するまで待っても問題ありません。

私のアドバイスは、余分なスレッドが何らかの理由でアプリケーションに大きな影響を及ぼさない限り(現代のマシンではほとんどそうではない)、そうしないことです。

の代わりにスレッドを再起動する次のオプションを検討:に

  • それはtrueに設定すると(私は私のthis例を使用していただけで何もせずに、スレッドの実行を可能pauseフラグを実装して何回もない限り、その何かを実行するように設計され、その後、( - 利用QRunnable
  • それはCであります++が、それは時間がないのPyQtに移植することができます) - (特にworker.cppdoWork()機能を確認してください)、そのような行動を示しはtrueに設定されています)、スレッドプールに戻ります。あなたがたまに毎回発生するタスクを持っていて、あなたはconstatly running separate threadを必要としないのなら、本当にいいですね。あなたはQRunnable::run()内で行わ計算の結果を得るために、シグナルとスロットを(使用したい場合は)

Iを最初QObjectから継承し、その後QRunnableから

  • 使用先物(Qt Concurrentモジュールをチェックする必要がありますQtが提供するさまざまなスレッディングテクノロジについて、まずExample use casesをお読みください。

  • 関連する問題