我遇到了QThread::currentThread()->quit();的问题

main.cpp:

#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();
    cObject->moveToThread(cThread);

    QObject::connect(cThread, SIGNAL(started()),
                     cObject, SLOT(doWork()));

    QObject::connect(cThread, SIGNAL(finished()),
                     cThread, SLOT(deleteLater()));

    QObject::connect(cThread, SIGNAL(finished()),
                     cObject, SLOT(deleteLater()));

    cThread->start();

    return a.exec();
}

myobject.cpp:
#include "myobject.h"

MyObject::MyObject(QObject *parent) :
    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;
    }
}

myobject.h:
#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QtCore>

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

signals:

public slots:
    void doWork();

};

#endif // MYOBJECT_H

它应该使用QThread::currentThread()->quit();停在myobject.cpp中,但并非如此。

收到一条错误消息,指出此问题太短。

解决方案:添加“返回”;退出电话后。

最佳答案

documentation of the function exit(这是退出调用):



这意味着您编写的代码进入循环后应具有应有的功能。您正在停止执行线程的事件循环,这是quit唯一要做的。该线程将完成doWork()的执行。

现在它提出了一个有趣的问题:cThreadcObject是否将被删除?不能。当使用the control returns to the event loop时,具有deleteLater的对象将被删除。但是在这里,您只是停止了线程的事件循环,因此,即使发布了deleteLater,也不会对其进行处理。

您的对象将继续存在,并且您将发生内存泄漏。一个简单的测试是为MyObject声明一个虚拟析构函数,该伪析构函数仅打印某些内容并检查是否调用了它。

07-24 09:44
查看更多