先看一段代码
class MyTest : public QObject
{
Q_OBJECT
private:
QEventLoop m_loop;
public:
MyTest(QObject* p=nullptr):QObject(p){}
~MyTest(){}
void start()
{
QtConcurrent::run([this]{
qDebug()<<"begin........";
m_loop.exec();
qDebug()<<"end.........";
});
}
void stop()
{
m_loop.quit();
}
}
当start()启动后,在另一个新的线程中运行 m_loop.exec(),然后当调用stop()后发现m_loop.exec()运行并不会结束。本想调试跟踪源代码,但是没找到实现的原理。
所以记住:QEventLoop构建对象时所在的线程,必须与调用exec()在同一个线程,否则quit()无法退出exec()
正确做法是:
class MyTest : public QObject
{
Q_OBJECT
public:
MyTest(QObject* p=nullptr):QObject(p){}
~MyTest(){}
void start()
{
QtConcurrent::run([this]{
qDebug()<<"begin........";
QEventLoop loop;
QObject::connect(this,&MyTest::signalStop, &loop, &QEventLoop::quit);
loop.exec();
qDebug()<<"end.........";
});
}
void stop()
{
emit signalStop();
}
signal:
void signalStop();
}
这样的情况下才能正确的退出exec()