【问题标题】:My QThread finished but I cannot get the signal我的 QThread 已完成,但我无法收到信号
【发布时间】: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


【解决方案1】:

你的代码会发生什么:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2013-07-24
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多