3

私はC++でQtアプリケーションを書いています。QThreadPoolでQRunnableを実行していて、メインスレッドにシグナルを送信します。問題は、接続が機能しないことです。emitを実行するコードが実際に呼び出されていることを確認したにもかかわらず、メインスレッドがシグナルを受信することはありません。これが私のコードです:

私の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のrun関数から、sendMessageを呼び出してから、QApplication :: exec()を実行します。offlineAnalysisMain.cppのthreadMsgスロット実装にブレークポイントがあり、その関数が呼び出されることはありません。

私は何が間違っているのですか?

アップデート:

私のOfflineAnalysisThread::run()関数の定義:

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

    QApplication::exec();
}

また、QApplication :: exec();を使用せずに試しましたが、成功しませんでした。

4

1 に答える 1

1

QApplication::exec()内からへの呼び出しを削除しますrun()。これは、理想的には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スレッドの境界を越える信号スロット接続を通過できます。

于 2013-03-02T22:04:09.820 に答える