为啥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永远不会退出?的主要内容,如果未能解决你的问题,请参考以下文章

QThread 不会停止/不处理信号

QThread 的started() 信号没有发出

qthreadnew不释放

为啥需要 processEvents() 才能让 QThread 工作?

如何从 GUI 停止 QThread

我不确定为啥我的 QThread 模式会阻塞