2013-03-02 107 views
3

我正在用C++編寫Qt應用程序。我有一個在QThreadPool中運行的QRunnable,它發送一個信號給主線程。問題是,連接不起作用:主線程永遠不會收到信號,即使我已經驗證了執行發射的代碼確實被調用了。這裏是我的代碼:Qt來自QRunnable的信號未收到/未連接

我QRunnable類:

class OfflineAnalysisThread : public QObject, public QRunnable 
{ 
Q_OBJECT 

public: 
void run(); 
void sendMessage(QString &qmsg) 
{ 
    emit threadMessageCallback(qmsg); 
} 

signals: 
void threadMessageCallback(QString &string); 
}; 

而調用類(主線程):

class OfflineAnalysisMain : public QObject 
{ 
Q_OBJECT 

public: 

    (...) 

public slots: 
void threadMsg(QString &string); 
}; 

實例化新QRunnables並開始它們的代碼:

void OfflineAnalysisMain::myFunction() 
{ 
    OfflineAnalysisThread *newTask = new OfflineAnalysisThread(); 

    QObject::connect(newTask, SIGNAL(threadMessageCallback(QString &)), this, SLOT(threadMsg(QString &))); 

    QThreadPool::globalInstance()->start(newTask); 
} 

因此,從我的QRunnable的運行函數中,我調用sendMessage,然後執行QApplication :: exec()。我在OfflineAnalysisMain.cpp中的threadMsg插槽實現上有一個斷點,並且該函數永遠不會被調用。

我在做什麼錯?

UPDATE:

我OfflineAnalysisThread ::運行的定義()函數:

void OfflineAnalysisThread::run() 
{ 
    std::string myMsg("This is my message"); 
    sendMessage(myMsg); 

    QApplication::exec(); 
} 

我自己也嘗試沒有的QApplication :: EXEC();,沒有成功。

+0

向我們展示您對OfflineAnalysisThread :: run()的定義。從你寫的內容來看,這聽起來不對。你不應該在run()中調用'QApplication :: exec()'。 – 2013-03-02 20:45:36

+0

我剛剛用我的run()的定義更新了我的帖子。請看一下。另外我也嘗試過沒有exec()(事實上,這是我的原始代碼,我添加了exec()以查看這是否可行)。 – 2013-03-02 21:30:03

回答

1

run()中刪除對QApplication::exec()的呼叫。這在您的main函數中被理想地稱爲。

爲了讓你的代碼工作,我不得不寫以下main功能:

#include <QApplication> 
#include <QMetaType> 

#include <offlineanalysismain.h> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    qRegisterMetaType<QString>("QString&"); 

    OfflineAnalysisMain* main = new OfflineAnalysisMain; 
    main->myFunction(); 

    return app.exec(); 
} 

注意調用qRegisterMetaType,允許Qt來通過一個信號槽連接交叉傳遞QString線程邊界。