范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

QtRemoteObject(QtRO)动态Replica实现进程间通信

  概述
  前一篇文章我们介绍了QtRO静态Replica来实现进程间通信的基本用法,本文接着介绍QtRO的另一个部分,动态Replica,也就是Dynamic Replica。
  QtRO本身是包含两种方式的,一个是静态,一个是动态,这两者实现方式稍有区别,其对应的场景也有所不同。
  上一篇文章我们说到,要实现QtRO最重要的一步是创建rep文件,通过在rep文件中定义公共接口从而进行共享,而静态和动态Replica的最大的区别就在于,静态Replica比如在server和client端都需要一个相同的rep文件作为接口定义,而动态是指Client这边不再需要rep文件,而是运行时动态获取接口定义。静态和动态的对比
  既然支持这两种方式,那么该如何选择使用呢?接下来看看二者的优劣:
  静态Replica:
  优势
  拥有明确的定义,更适合在C++中使用(因为有repc生成的头文件)。
  支持POD等复杂结构的定义。
  更高效。因为结构定义都已经在C++中定义好了,不需要动态传输、构建,节省了开销。
  劣势
  Source端和Replica端必须严格使用同一版本的rep文件,即使rep文件内只是添加了一行注释,否则会连接不上。
  动态Replica:
  优势
  由于Client端不需要rep文件,所以Server端可以随时修改,这就避免了静态模式下的缺点。
  劣势
  不支持POD等复杂结构定义。
  必须等初始化后才能使用,给编程增加了额外复杂度,同时增加了构建连接的额外开销。这个是动态这个特性决定的。POD类类型
  上面提到POD类型,简单的介绍一下。
  POD类类型就是指class、struct、union,且不具有用户定义的构造函数、析构函数、拷贝算子、赋值算子;不具有继承关系,因此没有基类;不具有虚函数,所以就没有虚表;非静态数据成员没有私有或保护属性的、没有引用类型的、没有非POD类类型的(即嵌套类都必须是POD)、没有指针到成员类型的(因为这个类型内含了this指针)
  简单的理解就是,POD即float、int等基本C++类型,还有QString、QPoint等基本Qt类型。而静态Replica支持POD类型,动态Replica不支持POD类型。示例
  接下来我们在上一篇文章的代码基础上进行修改,改成动态Replica的模式。Server端变化
  要支持动态Replica,Server端不需要做太大的改变,只有两点需要注意:
  上面我们提到动态Replica不支持POD类型,因为QPOD类型依赖于QDataStream的序列化和反序列化,这些都需要Qt元信息的支持。而动态Replica那边没有了rep文件,也就没有了对POD的反序列化能力,换句话说就是它不认识收到的POD二进制数据了。所以如果一定要使用POD类型的话,可以使用QVariantList和QVariantMap来定义。
  Server 端enableRemoting时必须传入第二个参数name,因为没有了类型,动态Replica端不知道该链接那个Server端,所以只能通过name来区分
  综上,需要修改的是:m_pHost->enableRemoting(m_pInterface,QStringLiteral("Interfaces1"));Client端变化
  动态Replica模式下,Client端不需要rep文件,所以在pro文件中,直接去掉:
  #REPC_REPLICA += # ../Reps/CommonInterface.rep
  然后在获得Replica的时候,需要用动态的版本:m_pInterface = m_pRemoteNode->acquireDynamic("Interfaces1");//动态获取
  这里的"Interfaces1"就是在Server端的名字。
  此外,还有一个关键的点需要改动,因为没了rep文件,程序刚启动时不知道连接的Server端长啥样。所以动态Replica的内部原理是建立连接后,首先获得Source端的元信息,然后动态地在Replica端构建属性、信号和槽。这些构造完毕后,Replica会发送一个initialized的信号,这之后该Replica才能够真正被使用。
  只有当Replica发出initialized信号后,该Replica才有Source端的元信息(属性、信号与槽),才能被使用。
  改动如下://只有Replica初始化好了才能真正使用它,要不然connect无效 connect(m_pInterface, &QRemoteObjectDynamicReplica::initialized, this, &MainWidget::onInitConnect); ... void MainWidget::onInitConnect() { connect(m_pInterface,SIGNAL(sigMessage(QString)), this,SLOT(onReceiveMsg(QString))); connect(this,SIGNAL(sigSendMsg(QString)), m_pInterface,SLOT(onMessage(QString))); }
  OK,改动已完成。
  我们看一下Client端完整的代码:#ifndef MAINWIDGET_H #define MAINWIDGET_H #include  #include  //#include "rep_CommonInterface_replica.h" #include  namespace Ui { class MainWidget; } class MainWidget : public QWidget { Q_OBJECT public: explicit MainWidget(QWidget *parent = nullptr); ~MainWidget(); signals: void sigSendMsg(QString msg); private slots: void onReceiveMsg(QString msg); void on_pushButton_clicked(); void on_lineEdit_returnPressed(); void onInitConnect(); private: void init(); private: Ui::MainWidget *ui; QRemoteObjectNode * m_pRemoteNode = nullptr; QRemoteObjectDynamicReplica * m_pInterface = nullptr; }; #endif // MAINWIDGET_H
  mainwindow.cpp#include "mainwidget.h" #include "ui_mainwidget.h" MainWidget::MainWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MainWidget) { ui->setupUi(this); this->setWindowTitle("This is Client"); init(); ui->textEdit->setReadOnly(true); } MainWidget::~MainWidget() { delete ui; } void MainWidget::init() { m_pRemoteNode = new QRemoteObjectNode(this); m_pRemoteNode->connectToNode(QUrl("local:interfaces")); // m_pInterface = m_pRemoteNode->acquire(); m_pInterface = m_pRemoteNode->acquireDynamic("Interfaces1");//动态获取 //只有Replica初始化好了才能真正使用它,要不然connect无效 connect(m_pInterface, &QRemoteObjectDynamicReplica::initialized, this, &MainWidget::onInitConnect); } /** * @brief MainWidget::onReceiveMsg * @param msg * 接收服务器下发的消息 */ void MainWidget::onReceiveMsg(QString msg) { ui->textEdit->append(QString("Server:") + msg); } void MainWidget::on_pushButton_clicked() { QString msg = ui->lineEdit->text(); if(!msg.isEmpty()){ // m_pInterface->onMessage(msg); //调用槽发送消息给服务器 emit sigSendMsg(msg); } ui->textEdit->append(QString("Client:") + msg); ui->lineEdit->clear(); } void MainWidget::on_lineEdit_returnPressed() { on_pushButton_clicked(); } void MainWidget::onInitConnect() { connect(m_pInterface,SIGNAL(sigMessage(QString)), this,SLOT(onReceiveMsg(QString))); connect(this,SIGNAL(sigSendMsg(QString)), m_pInterface,SLOT(onMessage(QString))); }
  OK,Server端只需要改动一行代码,所以就不列出来了。
  注意,在静态Replica中,我们从Client发送消息给Server端时,直接调用rep文件中定义的槽onMessage就可以了,但是在动态Replica时不能直接调用了,会报错找不到这个槽,所以改成连接信号槽的方式,如下:if(!msg.isEmpty()){ // m_pInterface->onMessage(msg); //调用槽发送消息给服务器 emit sigSendMsg(msg); } ... connect(this,SIGNAL(sigSendMsg(QString)), m_pInterface,SLOT(onMessage(QString)));
  点击领取Qt学习资料+视频教程~
  链接:http://docs.qq.com/doc/DUlVwTW1FZlZuWE9G

时效准确率提升之承运商路由网络挖掘得物技术1引子履约时长是电商的生命线,直接关系到用户的消费体验。新华网52022年双十一的报告显示,37。4的受访者希望次日达,29。91希望当日达。相较于其他物品,受访者对手机电脑数码产冻融循环下考虑塑性损伤演化的饱和岩石本构模型水利水电技术(中英文)官网网址httpssjwj。cbpt。cnki。net摘要针对冻融循环下饱和岩石,提出冻融损伤与岩石基质受载塑性损伤耦合的损伤变量计算方法。之后基于修正Dru我觉得现在是重制合金装备三部曲的最佳时机,不能再等了鉴于现代重制公告的频率,是时候将合金装备三部曲带回全新一代了。在其受欢迎程度达到顶峰时,合金装备系列可以轻松地与任何其他IP并驾齐驱。合金装备1998年的发行使合金装备系列牢牢地受恭喜武汉大学华中科技大学,获得香港认同,这是巨大的成就近日,香港一项优才计划推出,内地九所大学受益,其中包括华中科技大学。之前,香港另一份优才计划显示,武汉大学医学学士获准在香港行医据说,迄今为止内地只有这三所大学的医学学士获准在港行提现时效慢?手续费高?降本增效有妙招!许多新卖家朋友在刚开启跨境电商业务时,总会面临这样一个问题跨境交易提现时效很慢,手续费也很高,有没有什么办法可以减少成本,提高效率呢?事实上,随着跨境电商市场的不断扩大,第三方跨境互联网保险管卖不管赔怎么破?蚂蚁保安心赔2。0版提升理赔审核时效丨大厂金融事记者苗艺伟编辑近日,中国最大的互联网保险代理平台之一蚂蚁保升级安心赔到2。0版,除了线上化率理赔速度自动化等多个关键指标继续提升的同时,理赔前置化透明化可互动的理念也逐步落地。界面三巨头合力砍下77分,76人送火箭6连败!已过时效性,谨慎收看北京时间2023年2月14日NBA常规赛,费城76人坐镇主场迎战休斯敦火箭,最终,费城76人以123104战胜休斯敦火箭,费城76人获得3连胜的同时送给休斯敦火箭6连败。第一节,恩嘉兆电子获数千万元B轮融资,清华系资本力合金融领投36氪首发文郑灿城编辑彭孝秋36氪获悉,江苏嘉兆电子有限公司(以下简称嘉兆电子)已于近日完成数千万元B轮融资,本轮融资由力合金融领投,南通科创跟投,老股东毅达资本邦明资本追加投资。募集资金将贵阳南明2023年工作预期目标和主要任务近日,南明2023年政府工作报告全文发布了,报告中提到了南明2023年的工作目标和计划,城语摘取重点,以供大家了解南明在新的一年中的发展预期经济社会发展预期目标地区生产总值同比增长如何选择一辆婴儿车2023育儿季一这个婴儿车得轻便。每天带着小朋友在小区里晒太阳遛弯,都是推着小宝宝到达地点周末带孩子去公园动物园什么的,一天需要行走的路程真的是很大的量。有时候,玩的地方还有台阶什孩子夜夜遗尿真的难以避免吗?遗尿症,其一方面会对患儿的心理发育和社会行为造成影响,使他们更容易产生自卑心理和逆反行为另一方面还会给患儿家长带来不小的压力和困扰。怎样做才能避免遗尿导致湿身呢?以下提供几个方法1
巨亏58亿,豪言三年超越特斯拉的造车新势力要上市了蔚小理之后,港股市场即将迎来第四家造车新势力。零跑汽车即将登陆港股市场近日,网上有零跑汽车暂停香港IPO的流言。零跑汽车创始人朱江明紧急回应称假的,公司赴港IPO进展顺利。3月17用心做智能的小鹏G9从座舱到底盘都更智能太平洋汽车网评测频道新能源市场市场最近是真的火,蔚来带来了ES7,理想L9L8紧随其后,作为造车新势力三巨头蔚小理一员的小鹏,去年广州车展也给我们带来了小鹏G9首发亮相,在等待大半苹果正式承认添加广告,养了这么多年的韭菜,该割了安卓系统最令人讨厌的是什么?那肯定是广告!现在各家系统的负一屏搜索栏,稍不注意就会误触,然后自动下载各种软件。就拿小编来说,之前给家里的老人买了台安卓机,不到半个月,家里的老人就抱被控制的生活!奶头乐席卷校园,学生深陷其中却自以为是消遣文萌妈教育日记这几年来,教育和科技在共同发展,齐头并进。大国科技很重要,能让一个国家在互联网领域有更多的话语权。教育更加重要,培养出未来可以在任何领域里面独当一面,为祖国做出贡献,多数人难以理解科学的尽头是神学科学的尽头是神学,很多人一听到这个话,就会不假思索的反对。在很多人看来,这就是唯心迷信,不只是哪个宗教人士在刻意贬低科学,从而抬高神学。要弄明白科学的尽头是否是神学,首先我们得大致真的来了!德经济部长首次确认调整对华政策,中方已回应荒谬据悉,从今年上半年开始德国执政联盟内部就流行一种对华脱钩的声音,尤其是以德国外长贝尔伯克为代表的绿党对此举呼声非常高。表明该政策从口号正式走向实际的是上个月德媒的预警在一些官员的煽出口量暴增230!云南咖啡豆太火爆!为何这么香?来源央视财经今年上半年,我国重要的咖啡产区云南出口咖啡豆1。8万吨,同比增长2。3倍。云南咖啡豆出口量大增背后的原因是什么?今年出口价格如何?全球咖啡产量锐减云南咖啡出口量价齐升在共建一带一路为中哈合作注入新的生机与活力这是8月13日在哈萨克斯坦南部城市图尔克斯坦拍摄的哈萨克斯坦金骆驼集团有限公司的驼乳粉加工厂。新华社发(奥斯帕诺夫摄)新华社努尔苏丹9月13日电综述共建一带一路为中哈合作注入新的生灵活就业社保补贴又来了!但这几类人不能领,怎么回事?今天咱们来说一说灵活就业的社保补贴。大家都知道我国的社保包括城镇职工社保和城乡居民社保。但是有一些人因为没有在企业工作,又想缴纳城镇职工社保,所以就可以以灵活就业人员的身份去参保。油价最新预计下调幅度低于300元吨,92号95号汽油有望显著下跌国内成品油价又要发生变化,具体调价窗口开启时间为9月21日24时,这是今年以来第18轮油价调整,目前距离本轮调价时间愈来愈近,意味着全国汽柴油零售限价将要呈现新变动。根据油价预测最归化的流言越传越真,中国男篮终将迎来振兴的希望?随着归化的流言越传越真,球迷们奔走泣告,中国男篮终将迎来振兴的希望。根据国际篮联的规定,每支国家队可以拥有1名年满16周岁后获得本国国籍的球员,而这名球员从未代表原国籍的国家队参加