【问题标题】: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);" 调用了退出

谢谢

【问题讨论】:

    标签: qt qthread


    【解决方案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();
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 2018-06-09
      • 1970-01-01
      • 2019-09-23
      • 2014-08-04
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多