我正在使用QThread在单独的Thread中进行一些计算。 通过单击按钮启动线程,启动函数StartMeasurement()。 线程可以自己完成该过程(完成计算后) 并发出PyQT信号。或者,用户可以通过stopBtn点击停止该线程。
terminate()函数正在运行,但是当我尝试再次启动线程时遇到很多麻烦。
在这里使用movetoThread()方法是否值得推荐? 或者我怎样才能确保线程正确停止以启用正确的重启。 (意思是,开始新的!)
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()
答案 0 :(得分:1)
这不是问题。使用QThread
时的一般做法是将其finished()
信号连接到已通过deleteLater()
移动到单独线程的对象的moveToThread()
插槽。为了在你破坏你的线程时正确管理内存,它已经完成,因为它假设你将首先退出线程然后销毁它的实例。 ;)这应该告诉你,停止线程与破坏这些对象无关,除非你已经建立了我上面描述的连接。
如果你使用quit()
和wait()
正确地停止了线程,那么重启一个线程是完全可以的,直到停止完成为止。
但是我的建议是不要这样做,除非额外的线程由于某种原因对您的应用程序产生巨大影响(现代机器极不可能)。
请考虑以下选项,而不是重新启动线程:
pause
标志,如果它被设置为true
(我已多次使用this我的例子,那么只会让线程运行而不做任何事情演示此类行为(特别检查worker.cpp
和doWork()
函数) - 它在C ++中,但可以立即移植到PyQt
QRunnable
- 它旨在运行某些内容然后(除非autoDelete
设置为true
)返回到线程池。如果你偶尔会发生任务并且你不需要一个常量运行的单独线程,这真的很好。如果您想使用信号和广告位(要在QRunnable::run()
内完成计算结果,您必须首先从QObject
继承,然后从QRunnable
继承我建议你先阅读Example use cases,了解Qt提供的各种线程技术。