使用GUI

时间:2017-05-16 15:46:38

标签: pyqt qthread

我正在使用QThread在单独的Thread中进行一些计算。 通过单击按钮启动线程,启动函数StartMeasurement()。 线程可以自己完成该过程(完成计算后) 并发出PyQT信号。或者,用户可以通过stopBtn点击停止该线程。

terminate()函数正在运行,但是当我尝试再次启动线程时遇到很多麻烦。

在这里使用movetoThread()方法是否值得推荐? 或者我怎样才能确保线程正确停止以启用正确的重启。 (意思是,开始新的!)

在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 个答案:

答案 0 :(得分:1)

这不是问题。使用QThread时的一般做法是将其finished()信号连接到已通过deleteLater()移动到单独线程的对象的moveToThread()插槽。为了在你破坏你的线程时正确管理内存,它已经完成,因为它假设你将首先退出线程然后销毁它的实例。 ;)这应该告诉你,停止线程与破坏这些对象无关,除非你已经建立了我上面描述的连接。

如果你使用quit()wait()正确地停止了线程,那么重启一个线程是完全可以的,直到停止完成为止。

但是我的建议是不要这样做,除非额外的线程由于某种原因对您的应用程序产生巨大影响(现代机器极不可能)。

请考虑以下选项,而不是重新启动线程:

  • 实现一个pause标志,如果它被设置为true(我已多次使用this我的例子,那么只会让线程运行而不做任何事情演示此类行为(特别检查worker.cppdoWork()函数) - 它在C ++中,但可以立即移植到PyQt
  • 使用QRunnable - 它旨在运行某些内容然后(除非autoDelete设置为true)返回到线程池。如果你偶尔会发生任务并且你不需要一个常量运行的单独线程,这真的很好。如果您想使用信号和广告位(要在QRunnable::run()内完成计算结果,您必须首先从QObject继承,然后从QRunnable继承
  • 使用期货(查看Qt Concurrent模块)

我建议你先阅读Example use cases,了解Qt提供的各种线程技术。