我正在用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);
};
实例化新QRunnable并启动它们的代码:
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();但没有成功。
答案 0 :(得分: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
。