2011-12-13 70 views
0
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(); 
} 

输出始终是:为什么qthread永不放弃?

˚F的QThread(0xbfdef1e0)真

˚F的QThread(0xbfdef1e0)真

˚F的QThread(0xbfdef1e0)真

我想知道为什么的QThread从未退出,因为我使用“QMetaObject :: invokeMethod(thread(),”quit“,Qt :: QueuedConnection);”

感谢

回答

0

你的线程决不会退却,因为它是在紧张的无限循环。如果你永远不屈服于Qt偶数循环,它不能执行任何排队的动作。为了运行事件循环,Qt不能神奇地停止你的代码的执行。

如果添加下面一行到你的循环,你会看到线程也被拦住:

QCoreApplication::processEvents(); 

,因为你仍然要屈从于Qt的事件循环,以便它能够将你的信号传递给另一个线程。

+0

a.f()在主线程中运行的不是子线程,子线程可以处理事件队列。 – camino

+0

我已经更新了答案以澄清 – Chris

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

}