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