我正在使用 QThread 在单独的线程中进行一些计算。通过单击按钮启动线程,启动函数 StartMeasurement()。Thread 可以自己完成这个过程(在完成计算之后)并发出 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()
Run Code Online (Sandbox Code Playgroud)
这不是问题。使用时的一般做法QThread是将其finished()信号连接到deleteLater()已通过moveToThread(). 这样做是为了在您销毁线程时正确管理内存,因为假设您将首先退出线程然后销毁其实例。;) 这应该告诉您停止线程与销毁这些对象无关,除非您已经建立了我上面描述的连接。
如果您已正确使用停止线程quit()并wait()实际等到停止完成,则重新启动线程是完全没问题的。
但是我的建议是不要这样做,除非由于某种原因额外的线程对您的应用程序产生了巨大影响(现代机器极不可能)。
而不是重新启动线程考虑以下选项:
pause标志,如果它被设置为true(我已经多次使用我的这个例子来演示这种行为(特别是检查worker.cpp和doWork()函数),它只是让线程运行而不做任何事情) - 它是在 C++ 中,但它可以移植到PyQt立刻)QRunnable- 它旨在运行某些东西,然后(除非autoDelete设置为true)返回到线程池。如果您的任务每隔一段时间发生一次,并且您不需要持续运行单独的线程,那就太好了。如果您想使用信号和槽(要在内部完成计算的结果,QRunnable::run()您必须首先继承自QObject,然后从QRunnable我建议您首先阅读Qt 提供的各种线程技术的示例用例。
| 归档时间: |
|
| 查看次数: |
2666 次 |
| 最近记录: |