Qt BlockingQueuedConnection使用场景和方法

Qt::BlockingQueuedConnection使用记录

使用场景

主线程需要等待工作线程返回数据才能继续执行。属于线程之间的同步操作,也可以使用信号量来实现。由于在子线程创建新的内存对象需要依附在ui线程,所以采用Qt提供的moveToThread比较方便。这时操作同步需要使用信号槽的Qt::BlockingQueuedConnection。

这里官方文档写的是接收对象不能存活在发送信号的线程,也就是说信号发送者和接受者可以是同一个obj,只要保证obj不在信号发送的线程即可。

测试代码

#ifndef QSIGNALBLOCK_H
#define QSIGNALBLOCK_H

#include <QObject>

class QSignalBlock : public QObject
{
    Q_OBJECT
public:
    explicit QSignalBlock(QObject *parent = nullptr);

signals:
    void sig_test_1();

public slots:
    void slot_test_1();
};

#endif // QSIGNALBLOCK_H

#include "qsignalblock.h"

#include <QDebug>

QSignalBlock::QSignalBlock(QObject *parent) : QObject(parent)
{
    connect(this, &QSignalBlock::sig_test_1, this, &QSignalBlock::slot_test_1,
            Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
}

void QSignalBlock::slot_test_1()
{
    qDebug() << "slot_test_1 called";
}

main.cpp

{
        QSignalBlock* obj = new QSignalBlock;
        QThread* t = new QThread;
        obj->moveToThread(t);

        t->start();
        qDebug("signal before");
        obj->sig_test_1();
        qDebug("signal after");

        t->quit();
        t->wait();
        delete t;
        delete obj;
    }

运行结果

signal before
slot_test_1 called
signal after
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值