2013-03-02 2 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없이 시도 :: 간부를(); 성공하지.

+0

'OfflineAnalysisThread :: run()'에 대한 정의를 보여주십시오. 당신이 쓴 것에서부터 그것은 옳지 않습니다. 'run()'에서'QApplication :: exec()'를 호출해서는 안됩니다. –

+0

방금 ​​내 정의를 run()으로 업데이트했습니다. 이것을 봐주세요. 또한 exec()없이 시도했다 (실제로 내 원래 코드를 exec() 작동하도록 추가 할 추가). –

답변

1

QApplication::exec()의 전화 번호를 run()에서 삭제하십시오. 이상적으로는 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을 전달할 수 있습니다 : 코드가 작동하도록하기 위해

, 나는 다음과 같은 main 함수를 작성했다 스레드 경계.

관련 문제