Important: Please read the Qt Code of Conduct -

Thread refuses to quit

  • It is supposed to stop in myobject.cpp with QThread::currentThread()->quit(); but it doesn't.

    @#include <QCoreApplication>
    #include <QtCore>
    #include "myobject.h"

    QThread* cThread;
    MyObject* cObject;

    int main(int argc, char *argv[])
    QCoreApplication a(argc, argv);
    cThread = new QThread();
    cObject = new MyObject();

    QObject::connect(cThread, SIGNAL(started()),
                     cObject, SLOT(doWork()));
    QObject::connect(cThread, SIGNAL(finished()),
                     cThread, SLOT(deleteLater()));
    QObject::connect(cThread, SIGNAL(finished()),
                     cObject, SLOT(deleteLater()));
    return a.exec&#40;&#41;;


    @#include "myobject.h"

    MyObject::MyObject(QObject *parent) :

    void MyObject::doWork()
    qDebug() << "Hi";
    QThread::currentThread()->quit(); // It is supposed to stop here, but it doesn't.
    for (int i = 0; i < 1000000; i++) {
    qDebug() << i;

    @#ifndef MYOBJECT_H
    #define MYOBJECT_H

    #include <QtCore>

    class MyObject : public QObject
    explicit MyObject(QObject *parent = 0);


    public slots:
    void doWork();


    #endif // MYOBJECT_H@

  • bq. void QThread::quit() [slot]
    Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).

    Processing must return to the event loop before it can exit, which does not happen until your million debug messages are emitted.

  • Moderators

    To clarify ChrisW67's point: Qt will not stop your thread in the middle of a function. If your thread got the "quit" command in the middle of doWork(), the thread will wait until doWork() returns before quitting.

    Terminating a thread in the middle of a function is dangerous and can cause data corruption.

Log in to reply