AUTOSAR_EXP_ARAComAPI的5章笔记(12)

☞返回总目录

5.4.6 方法

骨架侧的服务方法是抽象方法,必须由继承骨架的服务实现子类进行重写。让我们来看一下我们服务示例中的 Adjust 方法:

/*** 对于所有输出和非空返回参数* 生成一个包含非空返回值和/或输出参数的封装结构。*/
struct AdjustOutput 
{bool success;Position effective_position;
};virtual ara::core::Future<AdjustOutput> Adjust(const Position& position) = 0;

服务方法抽象定义中的IN-parameters直接映射到服务方法签名的方法参数。在这个用例中,IN-parameter是来自Position类型的position参数,由于它是非基本类型,因此被建模为 “const ref”(常量引用)。

服务方法签名的有趣部分是返回类型服务方法实现必须返回我们广泛讨论的ara::core::Future。这个想法很简单:我们不想强迫服务方法实现者通过这个 “入口点” 方法的简单返回信号来表示服务方法的完成!

也许服务方法实现者决定将服务调用的实际处理分派到一个中央工作线程池!那么,当 “入口点” 方法的返回表示服务调用完成并通知给通信管理时,这将非常糟糕。然后,在我们的工作线程池场景中,我们将不得不阻塞在服务方法内部的某种等待点,并等待工作线程的通知,表明它已经完成,只有这样我们才会从服务方法返回。在这种情况下,我们的服务方法内部将有一个阻塞的线程!从现代多核 CPU 的有效使用角度来看,这是不可接受的。

此部分内容难懂,可以结合以下图形理解此部分内容

返回的ara::core::Future包含一个作为模板参数的结构,该结构聚合了服务调用的所有输出参数。

以下两个代码示例展示了 Adjust 实现的两种变体,在第一种变体中,服务方法在方法体中直接同步处理,返回一个已经设置结果的 ara::core::Future;而在第二种示例中,工作被分派到异步工作线程,返回的ara::core::Future在返回时可能没有设置结果

using namespace ara::com;/*** 对RadarService的实现*/
class RadarServiceImpl : public RadarServiceSkeleton 
{
public:Future<AdjustOutput> Adjust(const Position& position){ara::core::Promise<AdjustOutput> promise;// 调用同步等待内整函数处理完毕,该函数提供结果struct AdjustOutput out = doAdjustInternal(position, &out.effective_position);promise.set_value(out);// 返回一个已经设置承诺的未来结果return promise.get_future();}private:AdjustOutput doAdjustInternal(const Position& position) {//... 实现}
};

正如您在上面的示例中看到的:在服务方法的主体内部,调用了一个内部方法doAdjustInternal(),该方法同步执行工作。即,在 doAdjustInternal()返回后,在 out 中设置了类似于服务方法输出参数的属性。然后,将这个 out 值设置在 ara::core::Promise 上,然后从 Promise 返回给创建的Future

这具有这样的效果:获得此 Future 作为返回的调用者可以立即调用 Future::get (),它不会阻塞,而是立即返回 AdjustOutput

现在让我们看一下异步工作线程变体

using namespace ara::com;/*** 我们对RadarService的实现*/
class RadarServiceImpl : public RadarServiceSkeleton 
{
public:Future<AdjustOutput> Adjust(const Position& position){ara::core::Promise<AdjustOutput> promise;auto future = promise.get_future();// 在新线程中异步调用内部调整函数std::thread t([this] (const Position& pos, ara::core::Promise prom) {prom.set_value(doAdjustInternal(pos));},std::cref(position), std::move(promise)).detach();// 我们返回一个此时可能已设置或未设置的未来...return future;}private:AdjustOutput doAdjustInternal(const Position& position) {//... 实现}
};

在这个示例中,doAdjustInternal() 在一个不同的异步线程中被调用:在一个小的 lambda 函数中调用了doAdjustInternal() ,并且,该lambda 函数负责将doAdjustInternal()处理的结果设置到Promise对象。

5.4.6.1 单向(One - Way)又名即发即忘(Fire - and - Forget)方法

骨架侧的 “单向 / 即发即忘” 方法与普通方法相比,签名更简单。由于不需要向调用者提供反馈,所以它是一个简单的 void 方法:

virtual void LogCurrentState() = 0;
5.4.6.1 引发应用程序错误

每当在服务方法实现检测到应用程序错误(根据接口描述判定)时,必须把该应用程序错误的错误码简单地存储到 Promise 中,Future 将从该 Promise 返回给调用者:

using namespace ara::com;
using namespace com::mycompany::division::radarservice;/*** 我们对 RadarService 的实现*/
class RadarServiceImpl : public RadarServiceSkeleton 
{
public:Future<CalibrateOutput> Calibrate(const std::string& configuration){ara::core::Promise<CalibrateOutput> promise;auto future = promise.get_future();// 我们检查给定的配置参数if (!checkConfigString(configuration)){ // 给定的参数无效:// 假设在 ARXML 中我们有一个名为 SpecificErrors 的错误域// 其中包含 InvalidConfigString 错误。// 请注意,数字错误码将隐式转换为 ara::core::ErrorCodepromise.SetError(SpecificErrorsErrc::InvalidConfigString);}else{//...}// 我们返回一个可能设置了异常的未来return future;}private:bool checkConfigString(const std::string& config);std::string curValidConfig_;
};

在这个示例中,Calibrate() 的实现检测到给定的配置字符串参数无效,并将相应的异常设置到 Promise 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 材质学习笔记08(雨滴流淌着色器/雨水涟漪着色器)

一.雨滴流淌着色器 法线贴图在红色通道和绿色通道上&#xff0c;那是法线的X轴和Y轴&#xff0c;在蓝色通道中 我有个用于雨滴流淌的蒙版&#xff0c;在Alpha通道中&#xff0c;有个时间偏移蒙版。这些贴图都是可以在PS上制作做来的&#xff0c;雨滴流淌图可以直接用笔刷画出来…

永恒之蓝漏洞

MS17-010是微软于2017年3月发布的一个安全补丁&#xff0c;旨在修复Windows操作系统中的一个严重漏洞&#xff0c;该漏洞被称为“永恒之蓝”&#xff08;EternalBlue&#xff09;。这个漏洞影响了Windows的Server Message Block&#xff08;SMB&#xff09;协议&#xff0c;允许…

Java集合剖析3】ArrayList

目录 拓展 1. 在面试时如何讲解一个集合的底层&#xff1f; 2. IDEA如何查看底层源码&#xff1f; 一、ArrayList底层数据结构 二、插入方法的具体实现 三、ArrayList底层原理总结 拓展 1. 在面试时如何讲解一个集合的底层&#xff1f; 底层的数据结构。插入方法的具体实现。…

vue综合指南(六)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南 目录 101、Vue 框架怎么实现对象和数组的监听&#xff1f; 102、Proxy 与 Object.d…

10 分钟使用豆包 MarsCode 帮我搭建一套后台管理系统

以下是「 豆包MarsCode 体验官」优秀文章&#xff0c;作者把梦想揉碎。 十分钟使用豆包 MarsCode 搭建后台管理项目 在这个快节奏的时代&#xff0c;开发者们总是希望能够快速、高效地完成项目的搭建与开发工作。无论是初创企业还是大型公司&#xff0c;后台管理系统都是必不可…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…

要在 Git Bash 中使用 `tree` 命令,下载并手动安装 `tree`。

0、git bash 安装 git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作) 1、下载并手动安装 tree 下载 tree.exe 从 tree for Windows 官方站点 下载 tree 的 Windows 可执行文件。tree for Window&#xff1a;https://gnuwin32.source…

鸿蒙应用开发:全面认识鸿蒙系统

前言 随着智能设备的普及和物联网的发展&#xff0c;对操作系统的需求也越来越多样化。鸿蒙操作系统作为一款面向全场景的分布式操作系统&#xff0c;其适用范围非常广泛&#xff0c;从智能手机到家用电器&#xff0c;再到工业设备&#xff0c;都能找到应用场景。特别是在智能…

Nginx如何配置Gzip

Nginx 配置 Gzip 压缩可以显著减小传输的文件大小&#xff0c;提高网页加载速度。以下是在 Nginx 中配置 Gzip 的详细步骤&#xff1a; 一、找到 Nginx 配置文件 Nginx 的配置文件通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf&#xff08;取决于 Ngin…

鸿蒙网络编程系列22-Web组件文件上传示例

1. web组件文件上传功能简介 鸿蒙的web组件可以加载网页&#xff0c;如果网页本身具备文件上传功能的话就比较尴尬了&#xff0c;因为html上传文件时&#xff0c;允许用户选择本地文件&#xff0c;但是鸿蒙因为安全性的考虑&#xff0c;只允许操作沙箱中的文件&#xff0c;所以…

物联网的应用以及优势

物联网智能项目涵盖了多个行业领域&#xff0c;随着技术的不断进步和普及&#xff0c;越来越多的应用案例成为主流趋势。此篇文章将概述一些主要的物联网智能项目类别及其优势和日常使用场景&#xff1a; 主流物联网智能项目 1. 智能家居: •优势: 提升居住体验&#xff0c;…

双十一母婴有什么好物推荐?双十一这五款母婴好物不容错过!

随着双十一购物狂欢节的来临&#xff0c;母婴用品市场再次迎来了消费者的热切关注。作为家长们为孩子和自身挑选必需品的重要时刻&#xff0c;母婴用品的质量和安全性无疑成为了关注的焦点。在众多品牌和商品中&#xff0c;我们精心筛选了本年度最受欢迎的母婴用品&#xff0c;…

24/10/14 算法笔记 循环神经网络RNN

RNN: 一种专门用于处理序列数据的神经网络&#xff0c;它能够捕捉时间序列中的动态特征。RNN的核心特点是其循环连接&#xff0c;这允许网络在不同时间步之间传递信息&#xff0c;从而实现对序列数据的记忆和处理能力。 应用的场景&#xff1a; 自然语言处理&#xff08;NLP&…

关于Python AI 编程助手Fitten Code的应用体验以及Python 修改删除 sys.path 路径以实现两个项目代码的合并

一、关于Python AI 编程助手Fitten Code的应用体验 AI现在无孔不入&#xff0c;现在都开始进入到编程中了&#xff0c;有一个能适用多种编译器环境的AI编程插件 Fitten Code。其适配了 Viusal Studio&#xff0c;VS Code(本文使用)&#xff0c;JetBrains 系列(本文使用)以及Vim…

如何使用C#实现Padim算法的训练和推理

目录 说明 项目背景 算法实现 预处理模块——图像预处理 主要模块——训练&#xff1a;Resnet层信息提取 主要模块——信息处理&#xff0c;计算Anomaly Map 主要模块——评估 主要模块——评估&#xff1a;门限值的确定 主要模块——推理 写在最后 项目下载链接 说…

进入 Searing-66 火焰星球:第一周游戏指南

Alpha 第四季已开启&#xff0c;穿越火焰星球 Searing-66&#xff0c;带你开启火热征程。准备好勇闯炙热的沙漠&#xff0c;那里有无情的高温和无情的挑战在等待着你。从高风险的烹饪对决到炙热的冒险&#xff0c;Searing-66 将把你的耐力推向极限。带上充足的水&#xff0c;天…

Java线程的状态以及转换条件,与操作系统线程状态的区别?

先看图增加点记忆。 Java线程状态&#xff1a; 线程状态转换图&#xff1a; 背景知识 JAVA的线程模型与操作系统线程的对应关系是1:1的&#xff0c;线程的调度权是由操作系统控制的。 为什么java的线程状态与操作系统不一致&#xff1f; JVM线程状态&#xff1a;RUNNAB…

【含开题报告+文档+PPT+源码】基于SSM的景行天下旅游网站的设计与实现

开题报告 随着互联网的快速发展&#xff0c;旅游业也逐渐进入了数字化时代。作为一个旅游目的地&#xff0c;云浮市意识到了互联网在促进旅游业发展方面的巨大潜力。为了更好地推广云浮的旅游资源&#xff0c;提高旅游服务质量&#xff0c;云浮市决定开发一个专门的旅游网站。…

【红日安全】vulnstack (一)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【红日安全】vulnstack &#xff08;一&#xff09; 靶场搭建靶场渗透明确目标信息收集phpadmin后台getshell 靶场搭建 靶场下载…

IP报文格式、IPv6概述

IPv4报文格式 IPv4报文首部长度至少为20字节(没有可选字段和填充的情况下)&#xff0c;下面来逐一介绍首部各个字段的含义 Version版本&#xff1a;表示采用哪一种具体的IP协议&#xff0c;对于IPv4来说该字段就填充4以表示&#xff0c;如果是IPv6就填充6IHL首部长度&#xff…