当前位置: 首页 > news >正文

[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、解耦耗时操作与响应

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


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

相关文章:

  • Netty源码—7.ByteBuf原理三
  • 蓝桥云客-染色时间
  • 1424.对角线遍历
  • 322 零钱兑换
  • 【大模型基础_毛玉仁】4.4 低秩适配方法
  • RocketMQ 4.x、5.x 性能对比
  • 绩效考核如何从形式化任务升级为公司战略工具?
  • 2025.3.25
  • 基于CondLaneNet论文和全卷积分割头的车道线head设计
  • QML输入控件: Dial基本用法与样式定制(1)
  • 【机器学习】imagenet2012 数据预处理数据预处理
  • K8S学习之基础五十二:k8s配置jenkins
  • Vite 与 Nuxt 深度对比分析
  • 软件设计模式-第一章
  • 数据源为postgres的多表关联flink开发需求,开发思路
  • jmeter通过json提取器获取接口返回token(超详细)
  • 3.1.2 内存池
  • Java.util包之Java.util.List接口
  • 【msyql】LInux安装Mysql
  • kubernetes高级应用之初始化容器
  • php能干嘛 wordpress/自动app优化最新版
  • 网站建设文化传播有限公司/如何成为app推广代理
  • 兰州网站卡法/网站是怎么优化推广的
  • 网站seo插件/个人博客网站怎么做
  • 免费站推广网站链接/滴滴友链
  • 网站托管维护/佛山seo培训