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

时间:2017-10-18 10:14:52

标签: c++ multithreading qt signals-slots

我正在寻找正确的模式,以便在基于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");

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

1 个答案:

答案 0 :(得分:1)

根据doc

  

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

你是否像这样调用方法start

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