为什么qthread永不退出?

时间:2011-12-13 04:01:23

标签: qt qthread

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;”

由于

2 个答案:

答案 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();

}