How quit QApplication with QThread
Solved
General and Desktop
-
If is line with singleShot comment, program exit correctly (Worker destructor is called). What is correct way, how quit application if is called QCoreApplication::quit(). I need call Worker destructor.
#include <QCoreApplication> #include <QThread> #include <QDebug> #include <QTimer> #include <QAbstractEventDispatcher> #include "Worker.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QThread* workerThread = new QThread(); Worker* worker = new Worker(); QObject::connect(workerThread, SIGNAL(started()), worker, SLOT(work())); QObject::connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater())); QObject::connect(workerThread, SIGNAL(destroyed(QObject*)), worker, SLOT(deleteLater())); QObject::connect(worker, SIGNAL(finished()), workerThread, SLOT(quit())); QObject::connect(worker, SIGNAL(finished()), qApp, SLOT(quit())); worker->moveToThread(workerThread); workerThread->start(); QTimer::singleShot(2000, qApp, [=](){QCoreApplication::quit();}); int ret = a.exec(); while (qApp->eventDispatcher()->processEvents(QEventLoop::AllEvents)) { } qDebug() << "end with" << ret; return ret; }
#ifndef WORKER_H #define WORKER_H #include <QObject> class Worker : public QObject { Q_OBJECT public: Worker(QObject* parent = 0); ~Worker(); public slots: void work(); signals: void finished(); }; #endif // WORKER_H
#include "Worker.h" #include <QDebug> Worker::Worker(QObject* parent) : QObject(parent) { } Worker::~Worker() { qDebug() << "~Worker()"; } void Worker::work() { static int i = 0; while (1) { qDebug() << i++; if (i == 2e4) { break; } } emit finished(); }
-
Hi,
You have to wait on your thread to be finished in that case.
QThread has such a method.
-
Great !
Then please mark the thread as solved using the "Topic Tools" button so that other forum users may know a solution has been found :)
Note that you may have to first select the "Ask as question" option and then you can mark the thread as solved.