2016-04-18 5 views
0

私のコードを実行すると、約50秒間実行されるスレッドが開始され、多くのバックグラウンドが実行されます。このプログラムを実行してすぐに終了すると、スレッドは決して死ぬことがないため、しばらくバックグラウンドで処理されます。 MianWindowクラスのcloseEventメソッドでスレッドを正常に終了させるにはどうすればよいですか?私は私の中で)私はこれが(私の出口を呼ぶであろうと期待される機能を、当該スレッドに信号「quitOperation」を作成し、)(出口と呼ばれる方法を設定してみました、その後、QThreadを正常に停止しようとしていますが、この実装で何が問題になっていますか?

myThread.quitOperation.emit() 

を使用しようとしましたスレッド私は、コンストラクタに次の行があるので:私は「myThreadが」いいえ属性「quitOperation」を持っていないと言って、それが壊れる最初の行を使用する場合、しかし

self.quitOperation.connect(self.exit) 

を。どうしてこれなの?より良い方法がありますか?

+1

スレッドクラス(シグナル定義を含む)を定義するコードを表示してください –

+0

一般に、SSCCEを提供すると、はるかに迅速なヘルプが得られます。 http://sscce.org/を参照してください。 – neuronet

答えて

0

私はPythonについてはわかりませんが、私はこのmyThread.quitOperation.emit()がスレッドを終了させるための信号を発すると仮定しています。要点は、ワーカーがスレッドを使用していて返さず、QCoreApplication::processEvents()を実行していない間に、myThreadは決して実際にリクエストを処理する機会がないことです(これはスレッドスターベーションと呼ばれます)。

正解は状況や、スレッドが行っている「もの」の性質によって異なる場合があります。最も一般的な方法は、メインスレッドがシグナルをワーカースレッドに送信し、スロットがフラグを設定する方法です。ブロッキングプロセスでは、このフラグを定期的にチェックします。それはあなたがやっている "もの"を停止し、ワーカースレッドに(好ましくは待ち行列に入れられた接続を持つ信号で)終了し、ワーカーオブジェクト自体にdeleteLater()を呼び出し、現在の機能から戻ることができますスレッドのイベントハンドラが実行され、ワー​​カーオブジェクトとそれ自身がクリアされるように、最終的に終了します。

単純な数学やディレクトリのナビゲーションなど、非常に高速な操作の巨大なサイクルで、数ミリ秒かかるだけで十分です。

あなたの「もの」にあなたがコントロールできない巨大なブロッキングパーツが含まれている場合(つまり、このフラグでコールをチェックすることはできません)、ワーカースレッドが終了するまでメインスレッドで待機する必要があります。

直接接続を使用してフラグを設定する場合、またはフラグを直接設定する場合、一貫性のない読み取りを防止するためにフラグの読み取り/書き込みアクセスをQMutexで保護してください。フラグのアクセス。

非常に落胆しますが、オプションでQThreadterminate()メソッドを使用して、スレッドを即座に終了させることができます。ヒープの破損、リソースの漏洩、デストラクタやクリーンアップコードが実行されず、実行が望ましくない状態で停止する可能性があるので、これを行うべきではありません。

関連する問題