我的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();
}
为什么公共(public)插槽 threadFinished 从未被调用?
注意:出现了“Thread finished”消息,但没有出现“TEST”消息。
最佳答案
您的代码中发生了什么:
- 创建
QApplication
- 创建
ThreadTester
运行方法
ThreadTester::runTests
执行以下操作:- 创建踏板对象
- 连接到结果
- 开始线程
- 等待线程...
- 现在线程开始工作并发出信号
- 由于您
connect
使用了默认的连接方法,插槽调用被安排在尚未开始的事件循环中运行。 - 线程完成
- …等待线程完成(可能在这里您期待最终结果,但看看稍后会发生什么)
事件循环开始
- 事件循环执行插槽
ThreadTester::threadFinished
的排队调用
- 事件循环等待下一个事件
关于c++ - 我的 QThread 已完成,但我无法收到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39214324/