关于多线程中QT信号槽的异步问题

2020-03-24:新增Qt::UniqueConnection类型
处理结论
链接参数参数描述
Qt::AutoConnection自动处理,缺省参数,在发送端与接收端处于同一线程时,等同于Qt::DirectConnection,否则自动使用Qt::QueuedConnection
Qt::DirectConnection最终处理效果类似于回调函数,槽函数于信号发送者处于同一线程
Qt::QueuedConnection槽函数不会马上被执行,槽函数于信号发送者位于不同线程,且触发信号时,信号发送线程会继续执行,注意传输到槽函数的变量有可能会被释放
Qt::BlockingQueuedConnection槽函数与信号发送者位于不同线程,且信号发送线程会在发送信号后阻塞,等待槽函数执行完毕后继续执行。这种方式线程安全,但是接受者与发送者处于同一线程时,会触发死锁
Qt::UniqueConnection这个类型可以与上面的任意类型结合使用。这种类型可以避免信号重复连接,即一旦设置了这个类型,那么当相同对象的相同槽函数去连接同一个信号时,connect返回连接失败。此类型在Qt 4.6被引入
处理效果
//	信号触发类定义如下
class QDemoThread:public QThread
{
    Q_OBJECT
public:
    QDemoThread();

signals:
    void signalDemo(const QString strText);

protected:
    void run();
};

void QDemoThread::run()
{

    sleep(1);


    QString str = QString("sender signals thread id:%1").arg(GetCurrentThreadId());


    qDebug() << str;

    qDebug() << tr("sender") << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");
    emit signalDemo(str);
    qDebug() << tr("sender") << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");

}
//	槽函数定义如下
void QRecvObject::slotDemo(const QString strText)
{
    qDebug() << tr("recv") << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");
    QString str = QString("recv signals thread id:%1").arg(GetCurrentThreadId());
    qDebug() << str;

    Sleep(2000);
    qDebug() << tr("recv") << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");
}
Qt::DirectConnection

在这里插入图片描述
可以看出,非常类似于回调的一种处理方式,信号的发送者和接受者位于同一线程,所以信号发送后的代码只能等待槽函数执行完毕后继续执行

Qt::QueuedConnection

在这里插入图片描述
信号的发送者和接受者位于不同线程,且两线程的执行时间无关联,信号发送者发送信号后,线程立即继续执行

Qt::BlockingQueuedConnection

在这里插入图片描述
信号的发送者和接受者位于不同的线程,但是信号发送者发出信号后,进入阻塞状态,等待槽函数执行完毕后,信号发送者继续执行

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值