QtRO是Qt RemoteObjects的简称,是从5.9开始Qt官方推出的一个用于进程间通信(IPC)的新模块。虽然该模块目前仍处于TP阶段,但已经足够稳定。由于项目开发需要,我们将一个大项目划分成了若干个子工程,各个子工程都是独立的程序,因此需要使用IPC来进行各模块间的协同工作。

QtRO优势

  • Qt-like编程。由于是官方模块,QtRO使用Qt经典的信号与槽进行编程通信,独有的Source/Replica模式让远程服务调用起来就像本地的一个QObject一样,所有底层链路序列化和反序列化都由QtRO自动完成,代码维护性很高;
  • 跨平台。由于是Qt官方模块,继承了“Write Once, Compile & Run Everywhere”的优良传统;
  • 兼容LPC和RPC。LPC即Local Process Communication,而RPC是指Remote Process Communication,两者都属于IPC。QtRO能够工作于这两种不同的模式:如果用于LPC,则QtRO使用QLocalSocket;如果是用于RPC,则使用QTcpSocket。一样的代码,一样的逻辑。

QtRO基本结构

QtRO本质上是一个点对点的通信网络。每个进程通过QRemoteObjectNode接入QtRO网络。功能提供节点(可以理解为服务器)需要使用QRemoteObjectHost将一个提供实际功能的QObject派生类注册进QtRO网络中,然后其他使用该功能的程序则通过各自的QRemoteObjectNode连接到该Host上,然后acquire一个该功能对象的Replica。等到该Replica初始化好后,该程序就能够使用Replica中的信号、槽以及属性,就好像功能类就在本地一样。

QtRO程序的基本结构如下图所示:

图中功能类Source有两个Replica。当Source发生改变时,例如属性值变化、发射信号等,QtRO会通知所有Replica,从而所有客户端都将得到通知。

QtRO连接建立过程

从图中我们可以看到几个关键步骤:

  1. 首先服务端要把功能类通过QRemoteObjectHostenableRemoting方法共享出来;
  2. 然后客户端要连接到该QRemoteObjectHost,然后acquire到Replica;
  3. QtRO会自动初始化该Replica,待初始化完后客户端就可以用该Replica了。

定义功能类

IPC本质上就是调用远程进程的功能。

QtRO中的功能类没什么特殊的,其实就是个QObject派生类,所以任何派生自QObject的类型都能够分享到QtRO网络中。但是为了更好地和其他模块开发者协同,推荐使用rep文件定义接口然后再实现的方式来编写功能类。

rep文件是一种DSL(Domain Specific Language),专门用于定义QtRO接口。在编译的时候,该文件会首先经过repc.exe这个程序处理,生成对应的头文件和源文件。只要安装Qt时选择了Qt RemoteObjects模块,repc.exe就在Qt安装目录的bin目录中。

由于是接口定义文件,repc在处理时就有两种方式:

  1. 生成用于实现功能类的头文件和源文件。此时我们将得到一个“空”的功能类,我们只需要派生自该类,然后实现所有的接口即可;
  2. 生成用于客户端Replica的头文件和源文件。此时我们得到的就是Replica的C++实现。我们不需要做其他操作,只需要按照上面的连接流程连接到功能类就能用了。

一份定义,两处转译,确保了Source和Replica接口一致,能够接起来,又将接口定义与实现分成了明确的两个步骤,非常适合于大型工程的开发流程。

rep文件写起来很简单,具体可以参考Qt官方文档:http://doc.qt.io/qt-5/qtremoteobjects-repc.html。

Qt Remote Objects 简介相关推荐

  1. Qt Remote Object(QtRO)给指定的客户端发送消息

    概述 前面写了两篇文章介绍QtRO的使用方法,在这里: Qt Remote Object(QtRO)实现进程间通信 Qt Remote Object(QtRO)动态Replica实现进程间通信 然后会 ...

  2. Qt Remote Object(QtRO)实现进程间通信

    概述 Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC).在这之前,要实现进程间通信有多种方式,这里就不做介绍了,而Qt官方推出的这个新模 ...

  3. [Qt教程] 第21篇 数据库(一)Qt数据库应用简介

    [Qt教程] 第21篇 数据库(一)Qt数据库应用简介 楼主  发表于 2013-5-13 20:56:39 | 查看: 1403| 回复: 13 Qt数据库应用简介 版权声明 该文章原创于作者yaf ...

  4. [Qt教程] 第31篇 网络(一)Qt网络编程简介

    [Qt教程] 第31篇 网络(一)Qt网络编程简介 楼主  发表于 2013-8-28 17:04:17 | 查看: 515| 回复: 0 Qt网络编程简介 版权声明 该文章原创于作者yafeilin ...

  5. Qt Quick 3D简介

    Qt Quick 3D简介 前言 Qt Quick 3D是Qt自带的一套3D图形系统,与传统的Qt 3D不同的是,Qt Quick 3D采用QML来进行开发.本节则对Qt Quick 3D进行一次简单 ...

  6. 【Qt】Qt中JSON简介

    00. 目录 文章目录 00. 目录 01. JSON简介 02. JSON Support in Qt 03. JSON类 04. 附录 01. JSON简介 1.1 JSON概述 JSON(Jav ...

  7. 【QT】QObject简介

    1.简介 QObject类是所有Qt对象的基类,是Qt对象模型的核心,这个模型的主要特征为信号与槽,信号与槽是一个非常重要的机制,用于对象间的通信.连接信号与槽使用connect()函数,断开连接使用 ...

  8. QT——开发入门简介

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <嵌入式Linux开发实战> 1.你了解Qt吗? ...

  9. 【Qt炫酷动画】0.Qt动画类简介

    动画类继承关系 #mermaid-svg-ghWzAqD79vPW4ai1 {font-family:"trebuchet ms",verdana,arial,sans-serif ...

最新文章

  1. docker安装clickhouse_Docker中安装ClickHouse,单机、集群、分布式
  2. Linux下如何实现用户的集中管理(NIS服务器的高级配置)
  3. mysql设置edit_可以使用mysql自己带的config edit
  4. VTK:Filtering之TriangulateTerrainMap
  5. A-Z排序控件的实现
  6. php柱状图实现年龄分布,考官雅思写作小作文满分范文 柱状图:年龄分布
  7. Android之自定义ViewGroup
  8. C#_XXX事件 的重载均与委托System.EventHandler不匹配
  9. HOW TO:在 Visual C++ .NET 中从 System::String* 转换为 Char*
  10. 一加7pro保存的录音文件在哪一个文件夹?
  11. AAAI论文Joint Extraction of Entities and Overlapping Relations Using Position-Attentive Sequence阅读笔记
  12. VirtualBox虚拟机压缩减少体积
  13. 在虚拟机中安装Linux系统
  14. DDoS deflate:自动屏蔽DDOS攻击IP
  15. Xilinx zynqmp USB开发
  16. 无法计算机您系统的体验指数,win7无法计算机您系统的windows体验指数如何解决...
  17. 2019春招宇视科技嵌入式面试
  18. java排序算法(一)冒泡排序
  19. 路由交换技术实战七 FR 网络中配置 OSPF( 完成版 )
  20. 【卫朋】智能硬件 | 做好一款电子硬件产品,工具必不可少

热门文章

  1. SHELL脚本判断输入分数-根据输入分数提示相应信息SHELL脚本
  2. Python如何控制小数点后面的小数位数
  3. 全球第一经典语录,被500万人疯狂转载!!!
  4. 应用内打开京东、淘宝指定商品或店铺页面
  5. 计算机领域相关学术会议,计算机学科领域高质量国际学术会议
  6. 2020.2.22GDUT寒假训练排位赛2-H
  7. electron 笔记大全(未整理完)
  8. fastboot刷机以及命令详细解说
  9. 2018最新Koa2实现微信公众号前后端开发视频教程
  10. 如何给女友解释程序员写代码是怎么样的?