2015-10-19 125 views
2

我在QThread類中的信號/插槽存在問題。我的設計如下所示:帶線程的Qt信號插槽

class Manager : public QObject { 
    Q_OBJECT 
public: 
    Manager(QObject* parent) : QObject(parent) { 
     Thread thread* = new Thread(this); 
     connect(this, SIGNAL(testsignal()), thread, SLOT(test())); 
     thread->start(); 

     ... 

     emit testsignal(); 
    } 
signals: 
    void testsignal(); 
}; 

class Thread : public QThread { 
    Q_OBJECT 
public slots: 
    void test() { 
     qDebug() << "TEST"; 
    } 
private: 
    void run() {} 
}; 

信號永遠達不到我的test()方法。有人可以幫忙嗎?謝謝。

+1

'主題::測試()'不被定義爲一個槽。 – owacoder

+0

對不起。這是一個錯字。 – adapto

+0

'線程線程*'另一個錯字?你的代碼現在適用於我。 – SingerOfTheFall

回答

2

問題是sending signals across threads導致排隊信號到目標線程的事件隊列(排隊連接)。如果該線程從不處理事件,它將永遠不會得到信號。

此外,according to the QThread::run documentation

從該方法返回將結束線程的執行。

換句話說,有一個空的run方法會導致線程的即時終止,所以你發送一個信號到一個死的線程。

+0

好的。我爲我的run方法添加了一個infinte循環:'while(true){}'並且沒有任何變化。我從來沒有收到信號。 – adapto

+2

@adapto因爲您需要啓動* event *循環,所以最簡單的方法就是調用'this-> exec()'(或者不要重新實現運行)。 –

0

發送到QThread對象的信號將轉到父對象的線程。在這種情況下,創建它的相同線程

爲了有一個對象生活在另一個線程你應該把它移動到該線程:

class Manager : public QObject { 
    Q_OBJECT 
public: 
    Manager(QObject* parent) : QObject(parent) { 
     Thread thread* = new QThread(this); 
     Receiver* rec = new Receiver(); //no parent 
     connect(this, SIGNAL(testsignal()), rec, SLOT(test())); 
     connect(thread, SIGNAL(finished()), rec, SLOT(deleteLater())); 
     rec->moveToThread(thread); 
     thread->start(); 

     ... 

     emit testsignal(); 
    } 
signals: 
    void testsignal(); 
}; 

class Receiver: public QObject { 
    Q_OBJECT 
public slots: 
    void test() { 
     qDebug() << "TEST"; 
    } 
}; 
+0

謝謝。我試過這個,但沒有奏效。我添加了'connect(thread,SIGNAL(started()),mFetchTilesThread,SLOT(run()));'並將'run()'方法放到'public slot'中。這個方法被正確調用。 – adapto