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

QT异步编程之QMetaObject::invokeMethod

一、概述

1、QMetaObject::invokeMethod是Qt的一个功能强大的方法,它用于动态地调用一个对象地槽函数或成员函数。

2、这个方法允许你在运行时通过对象地元对象系统调用函数,而无需直接使用函数指针或其它静态机制。 

3、元对象系统是一个基于C++的扩展,为Qt提供了信号与槽机制、实时类型信息和动态属性系统。这个元对象主要基于QObject类、Q_OBJECT与moc(Meta-Object-Compiler)元对象编译器。

4、用于在线程之间调用某个对象的槽函数,它可以在不同线程之间调用槽函数,而不会引发死锁,是线程安全的

二、函数介绍

 bool invokeMethod(QObject *obj, const char *member,
                             Qt::ConnectionType,
                             QGenericReturnArgument ret,
                             QGenericArgument val0 = QGenericArgument(nullptr),
                             QGenericArgument val1 = QGenericArgument(),
                             QGenericArgument val2 = QGenericArgument(),
                             QGenericArgument val3 = QGenericArgument(),
                             QGenericArgument val4 = QGenericArgument(),
                             QGenericArgument val5 = QGenericArgument(),
                             QGenericArgument val6 = QGenericArgument(),
                             QGenericArgument val7 = QGenericArgument(),
                             QGenericArgument val8 = QGenericArgument(),
                             QGenericArgument val9 = QGenericArgument());

1、obj:要调用成员函数的对象指针

2、member:要调用的成员函数名,可以是信号、槽或者成员函数

3、type:指定连接类型。

 enum ConnectionType {
        AutoConnection,           //如果obj与调用者位于同一个线程中,则同步调用,否则异步调用
        DirectConnection,         //立即调用该成员
        QueuedConnection,         //不阻塞当前线程,同时执行
        BlockingQueuedConnection, //阻塞当前线程,直到目标线程处理完该方法为止
        UniqueConnection =  0x80
    };

4、ret:指定返回值类型和存储位置,使用Q_RETURE_ARG宏创建

5、val0、val1...:指定传递给成员函数的参数类型和值,使用Q_ARG宏创建。

三、使用案例 

 1、同步调用  Qt::BlockingQueuedConnection

(1)这个连接类型用于跨线程调用,即在一个线程中调用另一个线程的槽函数。它会阻塞当前线程,直到目标线程处理完该方法为止。

(2)这种类型的连接通常用于确保线程安全的操作,例如当你需要从一个线程请求数据并等待处理结果时。

 

 

2、异步调用  Qt::QueuedConnection

(1)该连接类型用于在不同线程之间进行非阻塞的方法调用。它是异步的

(2)当方法被调用时,调用线程不会等待目标线程处理完该方法,而是继续执行调用线程的后续代码。这种方法适合于不需要等待方法执行完的场景。

http://www.dtcms.com/a/27076.html

相关文章:

  • Windows桌面系统管理8:项目实施
  • 青少年编程都有哪些比赛可以参加
  • 网络安全大数据架构 网络安全之数据安全
  • RMSNorm算子的CUDA实现
  • MacOS Docker 安装指南
  • GO语言基础知识
  • ES,怎么实现查询一万条数据
  • mysql索引为什么用B+树不用,B树或者红黑树
  • 303. 区域和检索 - 数组不可变
  • Lab12_ Blind SQL injection with conditional errors
  • 测试WSS服务器
  • N-bit ADC过采样和L阶噪声整形后的SQNR表达式
  • 自动化测试面试会问哪些?
  • Python中的数学问题3-math、pow
  • 【大模型】-名词手册-扫盲
  • 分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现
  • swupdate升级文件系统内文件与分区的差异
  • 高德地图android sdk(备忘)
  • 科普:“Docker Desktop”和“Docker”以及“WSL”
  • Windows桌面系统管理6:计算机故障排查
  • 组合总和力扣--39
  • 如何安装虚拟机cenos7系统
  • Unity 聊天气泡根据文本内容适配
  • 解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
  • 当使用vcpkg安装的qt5时,在VS调用出现libcrypto-*-x64.dll不是有效路径时
  • Design Compiler:边界优化(Boundary Optimization)
  • nginx ngx_http_module(7) 指令详解
  • 从函数到神经网络
  • 解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
  • Unity性能优化个人经验总结(不定期更新)