使用GUI重新启动QThread

6
我正在使用QThread在独立线程中进行一些计算。通过单击按钮启动线程,并调用函数StartMeasurement()。 线程可以自行完成过程(在完成计算后),并发出PyQT信号finished。或者用户可以通过单击stopBtn停止线程。 terminate()函数是有效的,但当我尝试重新启动线程时,会遇到很多问题。
在这里建议使用movetoThread()方法吗? 还是该如何确保线程正确停止以实现适当的重启?(即开始新的!)
# starts the measurment in a Thread: 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个回答

7
不是问题。在使用QThread时,通常的做法是将已移至单独线程的对象的finished()信号连接到deleteLater()插槽上。这样做是为了在销毁线程之前正确管理内存,因为假定您会首先退出线程,然后销毁其实例。;) 这应该告诉您停止线程与销毁那些对象无关,除非您已经建立了我上面描述的连接。
如果您使用quit()和wait()来正确停止线程,则完全可以重新启动线程。
但是,我的建议是,除非额外的线程对您的应用程序有巨大影响(现代计算机极少出现这种情况),否则不要这样做。
与其重新启动线程,不如考虑以下选项:
  • 实现一个pause标志,如果设置为true,则使线程仅运行而不执行任何操作(我已经多次使用this示例来演示这种行为(检查worker.cppdoWork()函数),它是用C++编写的,但可以很快地移植到PyQt
  • 使用QRunnable - 它被设计为运行某些内容,然后(除非将autoDelete设置为true)返回到线程池。如果您有偶尔发生的任务,而不需要常驻单独的线程,那么它非常好用。如果想要使用信号和槽(以获取在QRunnable::run()中完成的计算结果),则必须首先从QObject继承,然后再从QRunnable继承
  • 使用futures(请检查Qt Concurrent模块)

我建议您先阅读Qt提供的各种线程技术的典型使用案例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接