3

我正在用 C++ 编写一个 Qt 应用程序。我有一个在 QThreadPool 中运行的 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 插槽实现上有一个断点,并且该函数从未被调用。

我究竟做错了什么?

更新:

我的 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,它允许 QtQString通过跨越线程边界的信号槽连接。

于 2013-03-02T22:04:09.820 回答