2

QThreadを使用して定期的なバックグラウンド作業を行っています。ソースコードは次のようになります。

class Worker(QObject):
    """ Separate QObject that does the work with affinity of 
        'DoStuffOnceASecond'"""
    def __init__(self):
        super(QWorker, self).__init__()

    def doWork(self):
        #... do work, post signal to consumer


class DoStuffOnceASecond(QThread):
    def __init__(self):
        super(DoStuffOnceASecond, self).__init__()   

    def run(self):
        """ Setup "pullFiles" to be called once a second"""
        self.timer= QTimer()
        self.worker = Worker()
        self.timer.setSingleShot(False)
        self.timer.timeout.connect(self.worker.doWork)
        self.timer.start(1000)
        self.exec_()

私はそのようなスレッドを終了するための最良の方法を探しています。1つのオプションは、メインスレッドからこのスレッドにシグナルを送信し、このスレッドにスロットを作成することです。これらのスロットはイベントループの一部として実行されるため、安全に取得されます。しかし、それなら私は自己終了するでしょう...そしてそれが非常にうまくいくかどうかはわかりません。

または、スレッドがイベントループを実行していることを意識する必要があるので、このスレッドを呼び出すだけで安全かどうか疑問に思っていexit()ますか?ドキュメント はこれが大丈夫であることを示しているようです:

この関数を呼び出した後、スレッドはイベントループを離れ、QEventLoop :: exec()の呼び出しから戻ります。QEventLoop :: exec()関数はreturnCodeを返します。

「イベントループを離れる」とは、現在のイベントの処理を終了できることを意味すると思います。または、QThreadは即座に終了しますか?

ここでのコードはpython(pyside 1.10、python 2.7)ですが、これはQThreadを使用するすべてのQTコードに簡単に適用できます。

4

1 に答える 1

1

戻りコードが0になることを気にしないのであれば、余分なスロットを宣言する必要はありません。そうすれば、スレッドを呼び出すだけの定義済みのスロットを使用できます。 「自己終了」することへの恐れについて-スレッドを終了するのではなく、イベントループを終了するだけです。また、exec()を再度呼び出すことで、いつでも開始できます。あなたはまだあなたのスレッドにとても親切なので、すべてが「とてもうまくいく」はずです。即時終了はQThread::terminateによって可能ですが、上記のメソッドが失敗したときにスレッドを強制終了する最後の必死の手段として意図されています。quit()exit(0)

于 2012-08-14T21:03:20.627 に答える