对于Qt来说,UI线程是主线程,对于同一UI线程中对象的通信可以通过connect进行信号与槽关联来实现,但是当UI中对象A中的子线程B需要和另外UI对象C进行通信的时候,如果这个时候使用connect来进行通信的话,需要B对象和A对象进行关联将信号发送到主线程中,然后A对象和C对象再建立联系,这样处理起来会比较繁琐。Qt提供了invokeMethod反射机制,就可以实现任何线程中的数据之间传输,使用invokeMethod的前提条件是1)对象继承QObject; 2)定义的类中使用Q_OBJECT(可以使用信号与槽),具体invokeMethod函数原型如下:

[static] bool QMetaObject::invokeMethod(Qobject *object, const char*member, Qt::Connection Type type, QGenericReturnArgument val = QGenericArgument(), .....);

其中object为C对象,member为C对象中的信号或者槽方法的名字(字符串),type为调用信号或者槽函数的同步异步方式,后面的为信号或者槽函数中的参数类型(元对象系统能够识别的参数类型)及需要传递的参数;具体调用方式如下所示:

class C: public Qobject
{Q_OBJECT
public:static C* getInstance() {static QScopedPoint(C) inst;if (Q_UNLIKELY(!inst)) {if (!inst) {inst.reset(new C);}}return inst.data();}  static void doAddNum(int a, int b) { //通过单例来获取对象C,从而调用C对象的槽方法;//也可以通过封装doAddNum方法来实现一个类D,这样的话C中只需要创建一个对象D然后调用D中的方法QMetaObject::invokeMethod(getInstance(), "addNum", Q_ARG(int, a), Q_ARG(int, b);}
public slots:void addNum(int a, int b);
private:C(Qobject *parent = nullptr) {}
};
class A : public QObject
{Q_OBJECT
public:A(QObject *object = nullptr) {//一般来说实现B和C直接的通信,需要B把数据发送给A,然后A发送给C来实现;//A和B同属于主线程,C属于子线程B* thread = new B(); thread->start();}
}
class B: public QThread
{Q_OBJect
public:B() {}void run() {C::doAddNum(1, 2);     //在子线程中完成对C对象中的槽方法的调用,属于跨线程调用}
}

Qt使用invokeMethod反射机制实现进程间的通信相关推荐

  1. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  2. 中的枚举属性函数_软件特攻队|Qt中的反射机制之Q_PROPERTY

    接触过Java的同学肯定知道"反射"这一神器,而所谓的反射,指的是对于任意的一个类,即使在运行状态下,都能知道这个类的所有方法和属性,并可以动态调用这些方法的一种机制. 但是非常遗 ...

  3. Linux系统编程(三)进程间的通信

    Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...

  4. 进程间的通信——无名管道

    进程间的通信--无名管道 宗旨:技术的学习是有限的,分享的精神是无限的. 一.进程间的通信 (1)同主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO).消息队列和共享内存.无名管道多用 ...

  5. 进程间的通信——共享内存

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  6. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...

  7. 网络编程之 进程间的通信之管道的使用

    如何使用管道是进程间通信的关键 博主先声明一下,关于处理进程创建以及销毁的方法.        "子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???&quo ...

  8. python进程间通信时间开销_python 进程间的通信

    python3,进程间的通信 本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is ...

  9. 第十章 进程间的通信 之 Java/Android多线程开发(二)

    文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...

最新文章

  1. 内行的AI盛会——北京智源大会带你洞见未来!
  2. python图像变形
  3. python3 替换字符串中指定位置字符
  4. range函数python3_Python3如何使用range函数替代xrange函数
  5. Java 11新字符串方法的基准
  6. LeetCode 1022. 从根到叶的二进制数之和(递归)
  7. android input出现一个多余文本窗口 解决办法
  8. Powerful array(CF-86D)
  9. 链表递增输出并释放空间
  10. 存储过程可重用的代码块_利用软件重用经验进行自动化测试推荐
  11. 二叉搜索树的公共祖先,二叉树的最近公共祖先
  12. 实施ERP过程中必须注意的“后天条件”
  13. 嵌入式学习二:怎么学习Linux操作系统
  14. c语言二元一次方程代码,二元一次方程(示例代码)
  15. 前中后序遍历的递归与非递归算法,层序遍历
  16. proteus信号峰值检测仪仿真
  17. 锂电池电量百分比计算_怎样估计锂电池剩余电量SOC
  18. win10右键卡顿原因_Win10桌面点右键一直卡顿转圈怎么解决
  19. python 计算众数、中位数、分位数、偏度、峰度
  20. python实现列表元素互异

热门文章

  1. react实现多行文本超出加省略号
  2. Redis与Zookeeper实现分布式锁的区别
  3. 使用C#調用外部程式或是執行DOS命令
  4. IdnentiyServer-使用客户端凭据访问API
  5. 【BZOJ4262】Sum 单调栈+线段树
  6. Tech·Ed 2009
  7. 应用ADO.net得到表
  8. hashmap为什么用红黑树_要看HashMap源码,先来看看它的设计思想
  9. android高德地图搜索地址,地点/周边搜索-Android平台-开发指南-高德地图车机版 | 高德地图API...
  10. 计算机扬天m400c联想,【联想扬天M参数】联想扬天M系列台式电脑参数-ZOL中关村在线...