使用 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.cppdoWork() 函数)- 它在 C++ 中,但可以立即移植到 PyQt
  • 使用 QRunnable - 它被设计为 运行 某些东西,然后(除非 autoDelete 设置为 true)return 到线程池。如果您的任务每隔一段时间就会发生一次,并且您不需要一个固定的 运行ning 单独线程,那就太好了。如果你想使用信号和槽(为了获得在 QRunnable::run() 中完成的计算结果,你必须首先继承 QObject 然后从 QRunnable
  • 使用期货(检查 Qt Concurrent 模块)

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