1

私は PySide スレッドに関する次の問題を調査してきましたが、ドキュメントがほとんど見つからなかったので、これがどのように進むかについての簡潔なフィードバックを期待して、私の調査結果に関する長い投稿をここに置きます。いくつかの Linux プロセスを呼び出すマルチスレッド GUI アプリケーションを構築しているとします。QThread クラスを使用して内部から QProcess を呼び出します。これは、アプリケーションが準備が整ったときに (異なるスレッドで) 複数のプロセスを同時に実行することを目的としています。

QThread クラスのみを使用し、QApplication メインループから開始しています

ケース 1 : - スレッド終了シグナルを、self.exit を呼び出す同じクラスの別の関数に接続します (スレッド クラスが終了するように) - PySide http:/ /tinyurl.com/qh7cooa

#!/usr/bin/python3.2
from PySide import QtGui
from PySide import QtCore
import sys, random

class ProcThread(QtCore.QThread):

    def __init__(self, parent=None):
        super(ProcThread, self).__init__(parent)

    def run(self):
        try:
            self.qproc = QtCore.QProcess()
            self.finished.connect(self.threadFinished)
            filename = "/home/user1/Desktop/fileno"+str(random.randint(1, 10000))+".txt"
            self.qproc.start("touch", [filename])       
        except Exception as error:
            print(str(error))
            raise(error)

    #self.exec_()

    def threadFinished(self):
        print("Thread has finished")
        self.qproc.close()

app = QtGui.QApplication(sys.argv) 
procthread = ProcThread()
procthread.start()
app.exec_()

結果: スレッドの終了がキャッチされ (「スレッドが終了しました」というメッセージが表示されます)、プロセスは実行されます (ファイルが作成されます) が、アプリケーションは終了しません。

ケース 2 : 前と同じですが、呼び出しもself._exec()行います (前のコード スニペットの関連する行のコメント を外します)。バックグラウンド ジョブ) Ctrl+Z の後 / 明示的に強制終了する必要がある

ケース 3QProcess : がを介して終了するときに送信される信号を接続しself.qproc.finished.connect(self.threadFinished)ます。self.exec_() を呼び出さない

try-except の間のコードのみを引用 - #self.exec_() はコメントのまま
self.qproc = QtCore.QProcess()
self.qproc.finished.connect(self.threadFinished)
filename = "/home/pantelis/Desktop/fileno" + str(random.randint(1, 10000)) + ".txt"
self.qproc.start("touch", [filename])

結果: ケース 2 と同様に、スレッドの終了はキャッチされず、プロセスは実行され (ファイルが作成され)、アプリケーションは再び終了しません。

ケース 4 : ケース 1 と同様に、 threadFinished self.exit() RESULTに次の行を追加します: ケース 2 と同様に、スレッドの終了がキャッチされず、プロセスが実行され (ファイルが作成され)、アプリケーションが再び終了しません。

ケース 5 : ケース 4 と同様に、self.exec_() 結果のコメントを外すだけです: スレッドの終了がキャッチされ (「スレッドが終了しました」というメッセージが出力されます)、ファイルが作成され、もう一度アプリケーションが終了しません。

Cases 6, 7, 8 :特定の関数から QProcess を明示的に終了するために 追加self.qproc.close() / self.qproc.terminate() / self.qproc.kill()されましたRESULT : Case 5 と同様threadFinished

self.terminatedの信号をQThreadリンクするなど、さまざまな代替手段を試すこともできthreadFinishedます。複雑な問題だと思いますが、いくつかの非常に大まかな質問があります: - 正式なドキュメントでは、スレッドがイベント処理を開始するには関数QThreadの呼び出しexec_()が必要であると記載されていますが、これは特定の関数の呼び出しなしで発生しているように見えるのはなぜですか - 場合によってはスレッドの終了はキャッチ/処理されますがthreadFinished、そうでないものもあります-最も重要なのは、なぜアプリケーションが終了しないのですか? (私も試しましたapp = QtCore.QCoreApplication(sys.argv)

4

1 に答える 1

1

ハンドラを呼び出すだけapp.quit()で、ウィジェットとメイン ウィンドウthreadFinishedが表示されている場合は、すべての子が破棄されます。hide()destroy()

于 2013-10-02T18:54:27.777 に答える