我正在使用QThread在单独的线程中进行一些计算。单击按钮即可启动线程获取,然后启动功能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()
这不是一个问题。使用时的一般做法QThread
是将其finished()
信号连接到deleteLater()
通过移至单独线程的对象的插槽moveToThread()
。这样做是为了在您随后销毁线程时正确管理内存,因为假定您先退出线程然后销毁其实例。;)这应该告诉您,除非您已经建立了我上面描述的连接,否则停止线程与破坏那些对象无关。
如果您已正确使用某个线程停止了线程的运行,那么重新启动线程是一个很好的选择quit()
,wait()
而实际上要等到停止完成为止。
但是,我的建议是不要这样做,除非该额外的线程由于某种原因对您的应用程序产生了巨大的影响(对于现代机器而言,这种可能性很小)。
不要重新启动线程,请考虑以下选项:
pause
标志,如果将其设置为,它只会使线程不执行任何操作true
(我已经多次使用我的这个示例来演示这种行为(特别是检查worker.cpp
和doWork()
函数))-它在C ++中,但是可以移植到PyQt
立刻)QRunnable
它的目的是运行某些程序,然后(除非autoDelete
设置为true
)返回线程池。如果您有不时执行的任务并且不需要恒定地运行单独的线程,那将非常好。如果要使用信号和时隙(要获得内部的计算结果,QRunnable::run()
则必须先从中继承QObject
,然后从QRunnable
我建议您首先阅读Qt提供的各种线程技术的示例用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句