为啥qthread永远不会退出?
Posted
技术标签:
【中文标题】为啥qthread永远不会退出?【英文标题】:why qthread never quit?为什么qthread永远不会退出? 【发布时间】:2011-12-13 04:01:23 【问题描述】:class A:public QObject
Q_OBJECT
public slots:
void f()
while(1)
qDebug()<<"f"<<thread()<<thread()->isRunning();
sleep(1);
**QMetaObject::invokeMethod(thread(), "quit", Qt::QueuedConnection);**
public slots:
void g() qDebug() << "g";
;
int main(int argc, char *argv[])
QCoreApplication app(argc, argv);
QThread th;
A a;
a.moveToThread(&th);
th.start();
a.f();// running in main thread
return app.exec();
输出总是:
f QThread(0xbfdef1e0) 真
f QThread(0xbfdef1e0) 真
f QThread(0xbfdef1e0) 真
我想知道为什么 qthread 永远不会退出,因为我确实在循环内使用 "QMetaObject::invokeMethod(thread(), "quit", Qt::QueuedConnection);" 调用了退出
谢谢
【问题讨论】:
【参考方案1】:您的线程永远不会退出,因为它处于一个紧密的无限循环中。如果您从不屈服于 Qt 偶数循环,它就无法执行任何排队的操作。 Qt 不能神奇地停止代码的执行以运行事件循环。
如果您在循环中添加以下行,您会看到线程确实停止了:
QCoreApplication::processEvents();
因为您仍然必须屈服于 Qt 的事件循环,以便它能够将您的信号传递给另一个线程。
【讨论】:
a.f() 在主线程而不是子线程中运行,子线程可以处理事件队列。【参考方案2】:int main(int argc, char *argv[])
QCoreApplication app(argc, argv);
QThread th;
A a;
a.moveToThread(&th);
th.moveToThread(&th); <------it works ,after I add this line
th.start();
a.f();// running in main thread
return app.exec();
【讨论】:
以上是关于为啥qthread永远不会退出?的主要内容,如果未能解决你的问题,请参考以下文章