【发布时间】:2016-08-29 20:06:34
【问题描述】:
我的 QThread 的 run 方法正在结束,但我无法收到信号。
这是完整的代码:
我的线程标题:
#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?
注意:会出现“线程完成”消息,但不会出现“TEST”消息。
【问题讨论】:
-
哪个qt版本?
-
对不起,我忘了把这个信息。 Qt 5.3.2
-
我打赌你没有事件循环。
-
@KelvinSalton 您的代码原样,添加了一个虚拟
MyDataObject以使其编译,对我来说在 Qt 5.3.2 (以及稍作修改的 4.8.1)中工作得很好.它打印两个输出消息。 -
然而,值得注意的是
ThreadTester的事件循环在该线程运行时实际上并没有运行,因为您在主线程上创建它,然后wait()让线程完成在允许程序继续前进到a.exec()之前,在其构造函数中。所以实际发生的是信号排队但直到a.exec()运行才被处理,这可能不是你所期望的。另请参阅wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loop。
标签: c++ qt signals-slots qthread