前言
使用Qt一般是做带界面的桌面软件,然而我在使用Qt写后台服务程序的时候遇到一个问题,程序调用QCoreApplication::quit()无法正常退出程序,程序一直出于挂起状态。以下是我的错误代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <QObject> class Test : public QObject { Q_OBJECT public: explicit Test(QObject *parent = nullptr); virtual ~Test(); public slots:
};
#include "test.h"
#include <QDebug>
#include <QCoreApplication>
Test::Test(QObject *parent) : QObject(parent) { if(something is wrong) qApp->quit(); }
Test::~Test() { qDebug()<<"delete"; }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Test test;
return a.exec(); }
|
上述代码导致程序无法退出,一直导致程序在挂起状态。错误原因是quit()函数是用于退出Qt程序主线程的事件循环,进而结束程序。但是此处是在执行a.exec()之前就执行了quit(),也就是说此时还没有进入主线程的事件循环,所以此处调用quit()是无效的。正确代码如下:
解决方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <QObject> class Test : public QObject { Q_OBJECT public: explicit Test(QObject *parent = nullptr); virtual ~Test(); public slots: };
#include "test.h" #include <QDebug> #include <QCoreApplication> #include <QTimer> Test::Test(QObject *parent) : QObject(parent) { if(something is wrong) QTimer::singleShot(1000,qApp,SLOT(quit())); } Test::~Test() { qDebug()<<"delete"; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Test test; return a.exec(); }
|
此处采用QTimer定时器,将quit()操作放在1秒之后,然后程序继续执行,就会进入主线程的事件循环,QTimer的timeout之后调用quit()这时就可以正确退出程序了。