Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程拒绝退出_C++_Qt_Qt5 - Fatal编程技术网

C++ 线程拒绝退出

C++ 线程拒绝退出,c++,qt,qt5,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

我遇到
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.h”
QThread*cThread;
MyObject*cObject;
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
cThread=新的QThread();
cObject=新的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();
返回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”
MyObject::MyObject(QObject*父对象):
QObject(父对象)
{
}
void MyObject::doWork()
{
qDebug()quit();//应该在这里停止,但它没有停止。
对于(int i=0;i<1000000;i++){
qDebug()quit();
但它没有

出现一个错误,说这个问题太短了

解决方案:在退出调用后添加“return;”。

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

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

查看QThread的代码:

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

我希望这能从以下方面有所帮助(quit就是这么说的):

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

这意味着您编写的代码通过进入循环而正常运行。您正在停止线程的事件循环的执行,这是quit唯一要做的事情。线程将完成
doWork()
的执行

现在,它提出了一个有趣的问题:
cThread
cObject
会被删除吗?不会。带有deleteLater的对象将在发布时被删除。但在这里,您刚刚停止了线程的事件循环,因此即使deleteLater被发布,它们也不会被处理


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

即使事件循环正确退出,也不会阻止在退出()之后执行for循环callYes,你是对的,我看到了错误的代码。我会修复我的答案。嗯……有什么办法修复内存泄漏吗?我想我必须返回事件循环,然后调用quit?但问题是我没有访问事件循环的权限。Qt handles
deleteLater()
正确,不会造成内存泄漏。如果您子类化
QThread
,并使用
void deleteLater(){qDebug()观察其
deleteLater()
调用
emit started
run();