Я пишу приложение Qt на С++. У меня есть QRunnable, работающий в QThreadPool, и он отправляет сигнал в основной поток. Проблема в том, что соединение не работает: сигнал никогда не принимается основным потоком, хотя я убедился, что код, выполняющий отправку, действительно вызывается. Вот мой код:
Мой класс 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 я вызываю sendMessage, а затем выполняю QApplication::exec(). У меня есть точка останова в реализации слота threadMsg в OfflineAnalysisMain.cpp, и эта функция никогда не вызывается.
Что я делаю неправильно?
ОБНОВИТЬ:
Определение моей функции OfflineAnalysisThread::run():
void OfflineAnalysisThread::run()
{
std::string myMsg("This is my message");
sendMessage(myMsg);
QApplication::exec();
}
Я также пробовал без QApplication::exec();, но безуспешно.
OfflineAnalysisThread::run()
. Судя по тому, что вы написали, это неправильно. Вы не должны звонитьQApplication::exec()
изrun()
. - person RA.   schedule 03.03.2013