线程拒绝退出

时间:2013-04-17 02:39:08

标签: c++ qt qt5

我遇到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中停止,但它不会。

收到错误消息说这个问题太短了。

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

2 个答案:

答案 0 :(得分:1)

来自documentation of the function exit(这就是戒烟):

  

注意,与同名的C库函数不同,这个   函数确实返回调用者 - 它是事件处理   停止

这意味着您编写的代码通过循环进行操作。您正在停止执行该线程的事件循环,这是退出所做的唯一事情。该线程将完成doWork()的执行。

现在它提出了一个有趣的问题:cThreadcObject会被删除吗?否。the control returns to the event loop时将删除具有 deleteLater 的对象。但是在这里你刚刚停止了线程的事件循环,所以即使 deleteLater 被发布,它们也不会被处理。

您的对象将存活并且您将有内存泄漏。一个简单的测试是为MyObject声明一个虚拟析构函数,它只打印一些东西并检查它是否被调用。

答案 1 :(得分:0)

quit函数只会终止与该线程关联的事件循环(如果有的话)。

默认情况下,run方法调用启动事件循环的exec方法。

查看QThread的代码:

emit started
run();

这意味着当发生 started 事件时,您的事件循环尚未启动,因为它只会在run方法内部启动。 quit 方法仅在已使用 exec 调用启动事件循环时才有效。

我希望这可以提供帮助