gpt4 book ai didi

c++ - 我的 QThread 已完成,但我无法收到信号

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:30 28 4
gpt4 key购买 nike

我的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”消息。

最佳答案

您的代码中发生了什么:

  1. 创建QApplication
  2. 创建ThreadTester
  3. 运行方法 ThreadTester::runTests 执行以下操作:

    • 创建踏板对象
    • 连接到结果
    • 开始线程
    • 等待线程...
    • 现在线程开始工作并发出信号
    • 由于您connect 使用了默认的连接方法,插槽调用被安排在尚未开始的事件循环中运行。
    • 线程完成
    • …等待线程完成(可能在这里您期待最终结果,但看看稍后会发生什么)
  4. 事件循环开始

  5. 事件循环执行插槽 ThreadTester::threadFinished
  6. 的排队调用
  7. 事件循环等待下一个事件

关于c++ - 我的 QThread 已完成,但我无法收到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39214324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com