3

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

主.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();
}

我的对象.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;
    }
}

我的对象.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

它应该在 myobject.cpp 中停止,QThread::currentThread()->quit();但它没有。

收到一个错误,说这个问题太短了。

解决方法:添加“return;” 在退出电话之后。

4

2 回答 2

1

函数退出的文档(这是退出调用):

请注意,与同名的 C 库函数不同,此函数确实返回给调用者——它是事件处理停止

这意味着您编写的代码通过进入循环来表现应有的表现。您正在停止执行线程的事件循环,这是quit所做的唯一事情。线程将完成doWork().

现在它提出了一个有趣的问题:会cThreadcObject被删除吗?否。当控件返回事件循环时,将删除带有deleteLater的对象。但是这里你只是停止了线程的事件循环,所以即使deleteLater被发布,它们也不会被处理。

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

于 2013-04-17T14:26:56.127 回答
0

如果你有一个,quit函数只会终止与线程关联的事件循环。

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

看QThread的代码:

emit started
run();

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

我希望这可以帮助

于 2013-04-17T03:37:10.547 回答