我遇到了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()
的执行。
现在它提出了一个有趣的问题:cThread
和cObject
是否将被删除?不能。当使用the control returns to the event loop时,具有deleteLater的对象将被删除。但是在这里,您只是停止了线程的事件循环,因此,即使发布了deleteLater,也不会对其进行处理。
您的对象将继续存在,并且您将发生内存泄漏。一个简单的测试是为MyObject
声明一个虚拟析构函数,该伪析构函数仅打印某些内容并检查是否调用了它。