AUTOSAR_EXP_ARAComAPI的5章笔记(13)

☞返回总目录

5.4.7 事件(Events)

在骨架侧,服务实现负责通知事件的发生。如 5.4.2 RadarService Skeleton Class 所示,骨架为每个事件提供一个事件包装类的成员。骨架的事件包装类与代理的事件包装类看起来明显不同。

在骨架端,服务特定的事件包装类在骨架命名空间正下方的事件命名空间内定义。以示例事件BrakeEvent的事件包装类为例:

class BrakeEvent 
{
public:
    /**
     * 事件数据类型的快捷方式。
     */
    using SampleType = RadarObjects;

    ara::core::Result<void> Send(const SampleType &data);

    ara::core::Result<ara::com::SampleAllocateePtr<SampleType>> Allocate();

    /**
     * 发送数据后,您将失去所有权,并且无法再通过 SampleAllocateePtr 访问数据。
     * SampleAllocateePtr 的实现将具有 std::unique_ptr 的语义(请参阅 types.h)
     */
    ara::core::Result<void> Send(ara::com::SampleAllocateePtr<SampleType> data);
};

与代理侧类似,using指令为事件的具体数据类型引入了通用名称SampleType。我们提供了Send()方法,有两个不同变体,用于发送新的事件数据。

  • 第一个变体

第一个变体接受一个SampleType的引用。这种变体很直接:事件数据已由服务应用程序开发人员在某处分配,并通过引用传递给Send()的绑定实现。在调用Send()返回后,调用者的数据可能会被删除或更改。绑定实现将在调用中进行复制。

疑问Send()不是服务提供者用来在事件发送更新时,把事件数据发送给其订阅者的吗?怎么调用者的数据可能会被删除或更改呢?

  • 第二个变体及相关概念

Send()的第二个变体也有一个名为data的参数,但它是类型为ara::com::SampleAllocateePtr<SampleType>。根据一般方法,只提供抽象接口,并最终建议映射提供到现有 C++ 类型(请参阅第 4.6 节),在这里引入的这个指针类型应表现得像std::unique_ptr<T>。这意味着:只有一方可以持有指针 —— 如果所有者想要放弃它,他必须通过std::move()显式地进行。

为了理解这个概念,我们必须首先查看事件包装类中的第三个方法:

ara::com::SampleAllocateePtr<SampleType> Allocate();

Allocate()提供了一种为事件数据样本分配内存的方法,它返回一个ara::com::SampleAllocateePtr<SampleType>的智能指针,该指针指向了分配的内存,可以在分配的内存写入一个事件数据样本。然后,我们可以将这个返回的智能指针传递给即将调用的Send()的第二个变体。

问题:为什么要让绑定实现Allocate()为即将给发送给潜在消费者的事件数据进行内存分配呢?

答案很简单:有优化数据复制的可能性。

下面这个夸张的例子可以让事情更清楚:假设我们这里讨论的事件(类型为RadarObjects)可能非常大,即它包含一个向量,这个向量可能会变得非常大(比如说几百千字节)。在Send()的第一个变体中,你将在应用程序进程的堆上自行分配这个事件的内存。然后 —— 在调用Send()的第一个变体期间 —— 绑定实现Send()必须将这个事件数据从(私有的)进程堆复制到一个消费者可以访问的内存位置。如果要复制的事件数据非常大,并且这种事件发生的频率很高,那么仅仅是数据复制的运行时间就可能会造成影响。

Allocate()和发送事件数据的第二个变体(Send(SampleAllocateePtr<SampleType>))相结合的想法是最终避免这种复制!一个智能的绑定实现可能会以某种方式实现Allocate()方法,使得它在一个位置分配内存,在这个位置上写入者(服务 / 事件提供者)和读取者(服务 / 事件消费者)都可以直接访问它!所以设计了一个ara::com::SampleAllocateePtr<SampleType>的指针,它指向接收者附近的内存。这样的双方都可以直接访问的位置通常被称为 “共享内存”。为了数据一致性,对这样的区域的访问应该在读取者和写入者之间进行同步。

这就是为什么Allocate()方法返回这样一个带有它所指向的数据的单一 / 唯一用户方面的智能指针:在潜在的写入者(服务 / 事件提供者端)调用了Allocate()之后,只要他将其交给Send()的第二个变体,在那里他明确地放弃所有权,他就可以访问 / 写入所指向的数据!这是必要的,因为在调用之后,读取者将访问数据并且需要一个一致的数据视图。

以下是示例代码:

using namespace ara::com;

// 我们对 RadarService 的实现 - RadarServiceSkeleton 的子类
RadarServiceImpl myRadarService;

/**
 * 在发生 BrakeEvent 时调用的处理程序
 */
void BrakeEventHandler() {
    // 让绑定为事件数据分配内存...
    SampleAllocateePtr<BrakeEvent::SampleType> curSamplePtr =
        myRadarService.BrakeEvent.Allocate();

    // 填充事件数据...
    curSamplePtr->active = true;
    fillVector(curSamplePtr->objects);

    // 现在通知消费者事件...
    myRadarService.BrakeEvent.Send(std::move(curSamplePtr));

    // 现在通过 curSamplePtr 访问数据将失败 - 
    // 我们已经放弃了所有权!
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题

前阵子发现阿里云的docker加速镜像失效了&#xff08;甚至连nginx都拉取不了&#xff09;&#xff0c;重新换了并且加多了网络上比较常用的dokcer加速源&#xff0c;可以解决一部分问题&#xff0c;但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了&#xff0c;原因未…

libaom 源码分析:aomdec.c 文件

aomdec.c 功能:libaom 项目完成视频解码过程的 demo文件位置:libaom/apps/aomdec.c函数关系 命令行说明 终端输入 ./aomdec --help,输出如下,展示如何使用方法。Usage: ./aomdec <options> filenameOptions:--help Show usage options and exit…

基于Springboot+Vue的小型民营加油站管理系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

libaom 源码分析综述【持续更新】

libaom libaom 是 AOMedia&#xff08;开放媒体联盟&#xff09;开发的一个开源视频编解码器库&#xff0c;它是 AV1 视频压缩格式的参考实现&#xff0c;并被广泛用于多种生产系统中。libaom 支持多种功能&#xff0c;包括可扩展视频编码&#xff08;SVC&#xff09;、实时通信…

Linux权限和开发工具(1)

文章目录 1.Linux根目录的相关文件夹2.Linux软件管理器yum3.Linux编辑器-vim的基础使用1.命令模式下一些命令:有关光标的操作:有关复制删除的操作:有关字符替换的相关操作:有关注释的相关操作: 2.插入模式3.底行模式下一些命令:实现双窗口 4.vim命令 4.vim配置5.Linux编译器-gc…

架构设计笔记-9-软件可靠性

目录 知识要点 综合知识 案例分析 1.可靠性特性&#xff0c;软硬件可靠性对比 论文 1.论软件可靠性设计技术的应用 知识要点 软件架构需求过程主要是获取用户需求&#xff0c;标识系统中所要用到的构件&#xff0c;并进行架构需求评审。其中&#xff0c;标识构件又详细地…

AI周报(10.6-10.12)

AI应用-AI中医诊疗 AI中医诊疗通过整合中医“望、闻、问、切”的传统诊断方法&#xff0c;并结合现代AI技术&#xff0c;如自然语言处理和图像识别&#xff0c;来辅助医生进行更精准的诊断。 望诊&#xff0c;作为中医四诊之首&#xff0c;其精髓在于“司外揣内”。医者通过细致…

Java通过RAG构建专属知识问答机器人_超详细

RAG&#xff1a;融合检索与生成的文本精准生成技术 检索增强生成&#xff08;RAG&#xff09;是一种技术&#xff0c;它通过结合检索模型和生成模型来提高文本生成的准确性。具体来说&#xff0c;RAG首先利用检索模型从私有或专有的数据源中搜索相关信息&#xff0c;然后将这些…

STM32—SPI通讯协议

前言 由于I2C开漏外加上拉电阻的电路结构&#xff0c;使得通信线高电平的驱动能力比较弱&#xff0c;这就会号致&#xff0c;通信线由候电平变到高电平的时候&#xff0c;这个上升沿耗时比较长&#xff0c;这会限制I2C的最大通信速度&#xff0c; 所以&#xff0c;I2C的标准模…

uniapp学习(003-2 vue3学习 Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第15p-第p20的内容 文章目录 事件监听以及组件内置事件处理自定义模板快速创建uniapp条件渲染 v-if和v-elsev-e…

搭建一个vue3+vite框架

可以使用以下两种搭建方式 通过create-vue搭建vue3 项目&#xff08;建议使用&#xff09; create-vue create-vue 是 Vue.js 官方推荐的用于快速启动 Vite 驱动的 Vue 项目的脚手架工具。它简化了创建新 Vue 项目的过程&#xff0c;提供了预配置的项目结构&#xff0c;并集…

Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程

最近需要在 Mac 上远程连接控制我的 windows 电脑系统&#xff0c;经过一番尝试对于 win 来说还是微软自家推出的 Microsoft Remote Desktop for Mac 最最好用&#xff0c;没有之一 简介 Microsoft Remote Desktop是一款由微软公司开发的远程桌面连接工具&#xff0c;可以让用…

如何解决与kernel32.dll相关的常见错误:详细指南解析kernel32.dll文件缺失、损坏或错误加载问题

当你的电脑中出现错误kernel32.dll丢失的问题&#xff0c;会导致电脑不能出现正常运行&#xff0c;希望能够有效的帮助你有效的将丢失的kernel32.dll文件进行修复同时也给大家介绍一些关于kernel32.dll文件的相关介绍&#xff0c;希望能够有效的帮助你快速修复错误。 kernel32.…

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID&#xff0c;BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID)&#xff0c;BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节)&#xff1a;由16位(2字节)的桥优先级…

QT布局详解 QT5大布局详解

QT布局详解 QT5大布局详解 1. Qt 布局基础 在 Qt 中&#xff0c;布局管理器用于自动调整窗口中控件的位置和大小。它们根据控件的尺寸策略、父窗口的大小以及控件的彼此关系&#xff0c;动态地调整控件。 常用的布局类包括&#xff1a; QHBoxLayout&#xff1a;水平布局管理…

MybatisWebApp

如何构建一个有关Mybatis的Web&#xff1f; 在这里给出我自己的一些配置。我的TomCat版本&#xff1a;10.1.28 &#xff0c;IDEA版本&#xff1a;2024.1.4 Pom.XML文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/200…

小米电机与STM32——CAN通信

背景介绍&#xff1a;为了利用小米电机&#xff0c;搭建机械臂的关节&#xff0c;需要学习小米电机的使用方法。计划采用STM32驱动小米电机&#xff0c;实现指定运动&#xff0c;为此需要了解他们之间的通信方式&#xff0c;指令写入方法等。花了很多时间学习&#xff0c;但网络…

Solidity优质例子(二)物流的增删改查智能合约(附truffle测试)

本合约非常适合新手学习&#xff0c;其包含了基本的增删改查功能以及各个方式的不同之处的总结&#xff0c;本套合约我也编写了truffle测试&#xff0c;学习truffle测试的小伙伴也有福了~ 该合约的主要作用是通过区块链技术实现物流追踪系统的透明化、自动化与防篡改特性&#…

AES对称加密算法

AES&#xff08;Advanced Encryption Standard&#xff09;是取代DES而成为新标准的一种对称加密算法。在全世界提交的众多对称加密算法的候选中&#xff0c;其中有一个名为Rijndael的对称加密算法&#xff0c;将其命名为AES。 整体流程 分组长度 在AES中&#xff0c;分组长度…