我遇到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中停止,但它不会。
收到错误消息说这个问题太短了。
解决方案:添加“返回”;退出电话后。
答案 0 :(得分:1)
来自documentation of the function exit(这就是戒烟):
注意,与同名的C库函数不同,这个 函数确实返回调用者 - 它是事件处理 停止
这意味着您编写的代码通过循环进行操作。您正在停止执行该线程的事件循环,这是退出所做的唯一事情。该线程将完成doWork()
的执行。
现在它提出了一个有趣的问题:cThread
和cObject
会被删除吗?否。the control returns to the event loop时将删除具有 deleteLater 的对象。但是在这里你刚刚停止了线程的事件循环,所以即使 deleteLater 被发布,它们也不会被处理。
您的对象将存活并且您将有内存泄漏。一个简单的测试是为MyObject
声明一个虚拟析构函数,它只打印一些东西并检查它是否被调用。
答案 1 :(得分:0)