Метод запуска моего QThread завершается, но я не могу получить сигнал.
Вот весь код:
Заголовок моей темы:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QDebug>
#include "mydataobject.h"
class MyThread: public QThread
{
Q_OBJECT
public:
MyThread(MyDataObject data,
bool useData);
private:
void run();
signals:
void resultsReady(MyDataObject data);
private:
MyDataObject data;
bool useData;
};
#endif // MYTHREAD_H
Код моей темы:
#include "mythread.h"
MyThread::MyThread(MyDataObject data, bool useData)
{
this->data = data;
this->useData = useData;
}
void MyThread::run()
{
if( useData )
{
data.calculate(); // Do something
}
emit resultsReady(data);
qDebug() << "Thread finished";
}
Мой тестовый заголовок:
#ifndef THREADTESTER_H
#define THREADTESTER_H
#include <QDebug>
#include "mythread.h"
class ThreadTester: public QObject
{
Q_OBJECT
public:
ThreadTester();
void runTests();
public slots:
void threadFinished(MyDataObject data);
private:
MyDataObject data;
};
#endif // THREADTESTER_H
Мой тестовый код:
#include "threadtester.h"
ThreadTester::ThreadTester(){}
void ThreadTester::runTests()
{
qRegisterMetaType<MyDataObject>("MyDataObject");
MyDataObject data;
MyThread* thread = new MyThread(data, true);
connect(thread, SIGNAL(resultsReady(MyDataObject)),
this, SLOT(threadFinished(MyDataObject)));
thread->start();
thread->wait();
}
void ThreadTester::threadFinished(MyDataObject data)
{
qDebug() << "TEST";
this->data = data;
}
Основная функция:
#include <QApplication>
#include "threadtester.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ThreadTester threadTester;
threadTester.runTests();
return a.exec();
}
Почему публичный слот threadFinished никогда не вызывается?
Примечание: появляется сообщение "Поток завершен", а сообщение "ТЕСТ" нет.
ThreadTester
, возможно, также показав свойmain()
, если именно там вы создаете все эти вещи? Кроме того, просто из любопытства, почему вы используете базуQWidget
вместоQObject
? Это на самом деле виджет в форме (но у вас нет подходящего конструктора для этого, так что...)? - person Jason C   schedule 29.08.2016MyDataObject
для компиляции, отлично работает для меня с Qt 5.3.2 (а также с 4.8.1 с небольшими изменениями). Он печатает оба выходных сообщения. - person Jason C   schedule 30.08.2016ThreadTester
на самом деле не выполняется во время выполнения этого потока, поскольку вы создаете его в основном потоке, а затемwait()
для завершения потока в своем конструкторе, прежде чем позволить программе перейти кa.exec()
. Так что на самом деле происходит то, что сигнал ставится в очередь, но не обрабатывается до тех пор, пока не запуститсяa.exec()
, что, вероятно, не то, что вы ожидаете. См. также wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loop. - person Jason C   schedule 30.08.2016