2011-12-13 44 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(); 

}