Qt Remote Object实现进程间通信

1 概述

Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。QtRO本质上是一个点对点的通信网络。每个进程通过QRemoteObjectNode接入QtRO网络。功能提供节点(可以理解为服务器)需要使用QRemoteObjectHost将一个提供实际功能的QObject派生类注册进QtRO网络中,然后其他使用该功能的程序则通过各自的QRemoteObjectNode连接到该Host上,然后acquire一个该功能对象的Replica。等到该Replica初始化好后,该程序就能够使用Replica中的信号、槽以及属性,就好像功能类就在本地一样。QTRO分为两种Replica,一种时动态的Replica,一种是静态的Replica。

2静态和动态的对比

静态Replica:

优势

拥有明确的定义,更适合在C++中使用(因为有repc生成的头文件)。
支持POD等复杂结构的定义。
更高效。因为结构定义都已经在C++中定义好了,不需要动态传输、构建,节省了开销。

劣势

Source端和Replica端必须严格使用同一版本的rep文件,即使rep文件内只是添加了一行注释,否则会连接不上。

动态Replica

优势

由于Client端不需要rep文件,所以Server端可以随时修改,这就避免了静态模式下的缺点。

劣势

不支持POD等复杂结构定义。
必须等初始化后才能使用,给编程增加了额外复杂度,同时增加了构建连接的额外开销。这个是动态这个特性决定的。

pod类型简单的理解就是float、int、string、class、struct等类型。

3 静态Replica

服务端

1创建rep文件

rep文件是一种DSL(Domain Specific Language),专门用于定义QtRO接口。在编译的时候,该文件会首先经过repc.exe这个程序处理,生成对应的头文件和源文件。
commoninterface.rep

class CommonInterface
{
   
   
    SIGNAL(sigMessage(QString msg))   //server下发消息给client
    SLOT(void onMessage(QString msg)) //server接收client的消息
}

2编译

添加QtRO模块

QT += remoteobjects

添加rep文件

REPC_SOURCE += \
    ./Reps/CommonInterface.rep

编译,然后在程序的输出目录可以找到生成的rep头文件
在这里插入图片描述

3实现功能类

创建一个类,继承于自动生成的这个类,并实现其中所有的虚函数。
CommonInterface.h

#ifndef COMMONINTERFACE_H
#define COMMONINTERFACE_H

#include "rep_CommonInterface_source.h"

class CommonInterface:public CommonInterfaceSource
{
   
   
    Q_OBJECT
public:
    explicit CommonInterface(QObject * parent = nullptr);

    //接收消息
    void onMessage(QString msg) override;
    //发送消息
    void sendMsg(QString msg);
signals:
    void sigReceiveMsg(QString);
};

#endif // COMMONINTERFACE_H

CommonInterface.cpp

#include "CommonInterface.h"

CommonInterface::CommonInterface(QObject *parent):
    CommonInterfaceSource(parent)
{
   
   

}

void CommonInterface::onMessage(QString msg)
{
   
   
    emit sigReceiveMsg(msg);
}

void CommonInterface::sendMsg(QString msg)
{
   
   
    sigMessage(msg);
}

4实现Server的主逻辑

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "CommonInterface.h"
#include <QRemoteObjectHost>
#include <QDateTime>
QT_BEGIN_NAMESPACE
namespace Ui {
   
    class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
   
   
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    void init();
private slots:
    void onReceiveMsg(QString msg);
    void sendBtnClicked();
    void lineRetrunPressed();
private:
    Ui::Widget *ui;
    CommonInterface* m_pInterface=nullptr;
    QRemoteObjectHost* m_pHost=nullptr;
};
#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include "ui_Widget.h"

Widget::Widget(QWidget *
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值