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

标签 c++ qt signals-slots qthread

我的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/

相关文章:

c++ - OpenGL 显示列表 block glEnable(GL_COLOR_MATERIAL)

c++ - 最有效的 const char* 比较不区分大小写

c++ - 使 QLabel 宽度独立于文本

c++ - 如何将 'on double clicked' 事件添加到 QTableWidget 中的整行?

python - PyQt:将信号连接到插槽以启动后台操作

c++ - 为什么我的插槽没有被调用?

c++ - 查找索引数据结构,如 `std::vector`(不是数组)

c++ - 链接器找不到 Lua 库定义

qt - 如何更改音频 AVPacket 的音量

python - 在 pythonQt 中使用 BoolResult