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 handlesdeleteLater()
正确,不会造成内存泄漏。如果您子类化QThread
,并使用void deleteLater(){qDebug()观察其deleteLater()
调用
emit started
run();