调用 quit() 后清理 QThread

Posted

技术标签:

【中文标题】调用 quit() 后清理 QThread【英文标题】:Clean up QThread after calling quit() 【发布时间】:2010-08-16 07:32:11 【问题描述】:

我有问题。如果我调用 Abort(),运行函数将返回,而 complexMath 实例没有足够的时间进行清理。

我想要的是,在调用 Abort() 之后,complexMath 实例有足够的时间自行关闭,在返回之前清除所有待处理的信号和槽(在 complexMath 内部,它也有自己的信号和槽)。

void MyThread::Go()
  start();


void MyThread::Abort()
  emit stopNow();
  quit();


void MyThread::run()
  ComplexMath * complexMath = new ComplexMath();
  connect( complexMath, SIGNAL(OnCalculation(qint)), this, SLOTS(PartialOutput(qint)) );
  connect( this, SIGNAL(stopNow()), complexMath, SLOTS(deleteLater());
  exec();


void MyThread::PartialOutput(qint data)
  qDebug() << data;

谢谢!

【问题讨论】:

【参考方案1】:

我认为你可以摆脱 stopNow 信号:

void MyThread::Abort()
  quit();


void MyThread::run()
  ComplexMath * complexMath = new ComplexMath();
  connect( complexMath, SIGNAL(OnCalculation(qint)), this, SLOTS(PartialOutput(qint)) );
  exec();
  // Any code here will be run after the thread quits, and the event loop stops
  deleteLater();

【讨论】:

以上是关于调用 quit() 后清理 QThread的主要内容,如果未能解决你的问题,请参考以下文章

终止python程序的正确方法,无论调用位置如何,并进行清理

QT事件循环与QThread类的关闭quit(),wait()

清理redis缓存信息

杀死风暴拓扑后资源清理

调用 SDL_Quit() 时“停止工作”的基本 SDL2 代码

Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?