[Qt5] QMetaObject::invokeMethod使用

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨


一. 前言

QMetaObject::invokeMethod 结合 Qt::QueuedConnection 的作用是实现跨线程安全调用或异步执行方法。其核心目的是确保方法在目标对象的线程事件循环中执行,避免多线程竞争或直接操作UI线程的隐患。


二. 作用

QMetaObject::invokeMethod(this, [=]() {
    /*代码主体*/
    }, Qt::QueuedConnection);

1、跨线程调用
当前代码运行不在主线程中执行,在非目标对象(this)所属线程(如子线程),Qt::QueuedConnection会将方法调用封装为事件,投递到目标线程的事件队列。目标线程会在下一次事件循环时处理该请求,从而保证线程安全。

2、异步执行
即使在同一线程,使用 Qt::QueuedConnection 也会将方法调用延迟到事件循环的下一周期执行。这可以避免当前代码块未完成时直接调用方法可能引发的重入问题。


三. 使用场景

1、多线程环境

子线程需要更新UI或访问主线程资源时(如修改控件状态),必须通过队列连接将操作转发到主线程执行。例如:

// 子线程中更新UI
QMetaObject::invokeMethod(ui->label, "setText", Qt::QueuedConnection, Q_ARG(QString, "Done"));
//UI界面端操作需要转移到主线程进行绘制,否则会崩溃
QMetaObject::invokeMethod(this, [=] {
        m_sharedDataset->mainView()->setPen(QColor("yellow"));
        m_sharedDataset->mainView()->dispPath(pathFromHXLDCont(ho_Circle));
        });

2、避免重入或死锁

若某方法可能被递归调用或需要等待当前操作完成,异步执行可防止堆栈溢出或逻辑冲突。

3、解耦耗时操作与响应

主线程需要保持响应性时,可将耗时操作提交到子线程,再通过队列连接返回结果。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值