qt 通过将对象移动到跨线程发出信号

Posted

技术标签:

【中文标题】qt 通过将对象移动到跨线程发出信号【英文标题】:qt emitting a signal across threads by moving the object to 【发布时间】:2017-10-18 10:14:51 【问题描述】:

我正在寻找正确的模式以在基于 Qt 的应用程序中使用它进行异步处理。

这是一个应该接收信号的简化类

class Receiver : public QObject 
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = nullptr) : QObject(parent)     
public slots:
    void onNewMessage(Message message) 

    // ...
    
;

该类实例的创建是动态的(实际上也很简单 - 用于消息处理的对象数组)。

    Receiver* r;
    // ...
    if (r == nullptr) 
        r = new Receiver;
        r->moveToThread(new QThread);
        connect(this, &MessageGenerator::messageCompleted, r, &Receiver::onNewMessage);
    

在main函数中还存在一个注册:

    qRegisterMetaType<Message> ("Message");

问题是为什么永远不会调用 slot? 如果删除线程的东西(moveTOThread),那么一切正常, 但我更喜欢在不同线程的事件循环中进行处理

【问题讨论】:

你没有调用线程start 谢谢!我的注意力不集中:( 【参考方案1】:

根据doc:

构造一个新的 QThread 来管理一个新线程。父级拥有 QThread 的所有权。 在调用 start() 之前,线程不会开始执行。

你会这样调用方法start吗?

r = new Receiver;
t = new QThread();
r->moveToThread(t);
connect(this, &MessageGenerator::messageCompleted, r, &Receiver::onNewMessage);
t->start();

【讨论】:

以上是关于qt 通过将对象移动到跨线程发出信号的主要内容,如果未能解决你的问题,请参考以下文章

通过 Qt 信号/槽跨线程传递对象

Qt5跨线程信号和槽

如何向 Qt 中 QThread 类的特定对象发出信号?

QT中的信号与事件,多线程

PyQt跨线程发出信号

在 QObject 之间跨不同线程连接信号/插槽