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)true
f QThread(0xbfdef1e0)true
f QThread(0xbfdef1e0)true
我想知道为什么qthread永远不会退出,因为我使用“QMetaObject :: invokeMethod(thread(),”quit“,Qt :: QueuedConnection)在循环中调用quit;”
由于
答案 0 :(得分:0)
你的线程永远不会退出,因为它处于紧密的无限循环中。如果永远不会屈服于Qt偶数循环,它就无法执行任何排队操作。为了运行事件循环,Qt不能神奇地停止执行代码。
如果将以下行添加到循环中,您将看到该线程已停止:
QCoreApplication::processEvents();
因为你仍然必须屈服于Qt的事件循环,以便它能够将你的信号传递给另一个线程。
答案 1 :(得分:0)
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();
}