问题产生:
使用Qt创建项目过程中,发现项目窗口退出时,资源没有正常释放,后台仍然在运行。经过排查,是创建的线程没有安全释放,在网上搜索了一些方式,记录一下正常安全释放的方式。
安全释放方式:
背景:
定义了一个DateUpdate类,用于实现线程中时间显示,该类继承QObject。
class DateUpdate : public QObject
{
Q_OBJECT
public:
....
public slots:
void Start();
void Stop();
signals:
void updateDate(QString date, QString time);
void finish();
};
void DateUpdate::Start()
{
while(is_running){
QThread::sleep(1);
emit updateDate(QDateTime::currentDateTime().toString("yyyy/MM/dd"),
QDateTime::currentDateTime().toString("hh:mm:ss"));
}
}
void DateUpdate::Stop()
{
is_running = false;
emit finish();
}
采用MovetoThread的方式,创建线程:
dateUpdate = DateUpdate::getInstance();
update_date_thread = new QThread();
dateUpdate->moveToThread(update_date_thread);
void MainWindow::start_Work()
{
update_date_thread->start();
emit onStart();
}
void MainWindow::stop_Work()
{
emit onStop();
}
创建连接,如下代码,基本逻辑为,主界面发送onStop()消息,dateUpdate接收后,发送finished信号到主界面,主界面对dateUpdate对象进行deleteLater销毁释放。检测dateUpdate对象正常destoryed,update_date_thread线程quit退出,等待线程正常退出,触发finished事件后,对线程进行销毁delete Later。
connect(dateUpdate, &DateUpdate::finish, dateUpdate, &DateUpdate::deleteLater);
connect(dateUpdate, &DateUpdate::destroyed, update_date_thread, &QThread::quit);
connect(update_date_thread, &QThread::finished, update_date_thread, &QThread::deleteLater);