AUTOSAR_EXP_ARAComAPI的5章笔记(7)

☞ 返回总目录

5.3.6 Methods

对于远程服务提供的每种方法,Proxy Class都包含一个特定于该方法的包装类的成员。

在我们的示例中,有三种方法,相应的成员分别名为 Calibrate(类型为 methods::Calibrate)、Adjust(类型为 methods::Adjust)和 LogCurrentState(类型为 methods::LogCurrentState)。就像事件类一样,代理类所需的方法类是在一个特定的命名空间 methods 中生成的,而这个 methods 命名空间包含在代理命名空间内。代理中的方法成员用于调用我们的代理所连接的可能是远程服务实例所提供的方法。

让我们来看一下示例中生成的方法类 —— 在这里我们选取 Adjust 方法:

class Adjust {
public:
    /**
     * 对于所有的输出参数和非空返回参数
     * 会生成一个包含该非空返回值和/或输出参数的封闭结构体。
     */
    struct Output {
        bool success;
        Position effective_position;
    };

    /**
     * \brief 此操作将会调用该方法。
     *
     * 通过操作符,通信管理将会进行调用并返回一个 future(异步结果),它允许调用者获取方法的结果。
     *
     * \param[in] target_position  参考服务描述。
     *
     * \return 一个包含 Output 结构体的 future。
     */
    ara::core::Future<Output> operator()(const Position &target_position);
};

所以这个方法包装类并不是那么复杂。它仅仅由两部分组成:一个内部结构(struct Output)定义,它汇总了该方法所有的输出(OUT )/ 输入输出(INOUT )参数;还有一个括号运算符重载,使类看起来像函数,用于调用服务方法。

该运算符将服务方法的所有输入(IN )/ 输入输出(INOUT )参数作为输入(IN)参数包含在内。这意味着在抽象服务方法描述中的输入输出(INOUT )参数在 ara::com API 中被拆分成一对输入(IN)和输出(OUT)参数。

对一个服务方法(不是 “单向方法”)调用的返回值是一个ara::core::Future,其中模板参数是内部结构的类型,这个内部结构汇总了该方法的所有输出(OUT )参数。在下一小节中将详细介绍这个 ara::core::Future

5.3.6.1 One-Way aka Fire-and-Forget Methods

在介绍“普通” 方法提供的功能之前,我们在此简要介绍一下 “单向方法”,其实,我们在上一节中已经提到了这个术语。 ara::com 支持一种特殊的方法,我们称之为 “单向(one-way)” 或 “发射后不管(fire-and-forget)”。从技术上讲,这是一种只有输入(IN)参数的方法 —— 没有输出(OUT)参数,并且不允许引发错误。也无法与服务器进行握手 / 同步!因此,客户端 / 调用者完全无法得知服务器 / 被调用者是否已经处理了 “单向” 调用。

在某些通信模式中,这种尽力而为的方法就完全足够了。在这种情况下,从资源的角度来看,这种 “单向 / 发射后不管” 的语义是非常轻量级的。如果我们查看这种方法的签名,我们会发现它比常规方法的签名更简单。

class LogCurrentState {
public:
    /**
     * \brief 此操作将会调用该方法。
     *
     * 通过操作符,通信管理将会进行调用。
     *
     * 这是一个单向(one - way)方法,所以不会提供任何反馈(返回值/输出参数)。
     */
    void operator();
};
5.3.6.2 Event-Driven vs Polling access to method results

与上一节(5.3.5 小节)中描述的对事件数据的访问类似,我们也为基于事件驱动轮询的方法提供了 API 支持,以用于访问服务方法调用的结果。

这两种方法之间的区别的神奇之处在于返回的 ara::core::Futureara::core::Future 基本上是 C++11/C++14 std::future 类的扩展版本;详情见 [Specification of Adaptive Platform Core.pdf]

就像在事件数据访问中一样,这里的事件驱动意味着,一旦方法调用结果到达,方法的调用者(带有代理实例的应用程序)就会被 ara::com实现(Communication Management implementation)通知。

对于  ara::com实现来说,这意味着它必须在幕后设置某种等待机制(WaitEvent),一旦方法结果可用,该机制就会被唤醒,以通知 ara::com用户。那么 ara::core::Future 的不同使用模式是如何工作的呢?让我们更深入地了解一下我们的 ara::core::Future  及其提供的接口:

// 定义一个名为 future_status 的枚举类,基于无符号 8 位整数
enum class future_status : uint8_t
{
    ready,    // 表示共享状态已准备好
    timeout   // 表示在指定的超时时间过去之前,共享状态没有准备好
};

// 定义一个模板类 Future,它接受类型参数 T 和类型参数 E(默认为 ErrorCode)
template <typename T, typename E = ErrorCode>
class Future
{
public:
    // 默认构造函数,使用 noexcept 修饰表示不会抛出异常
    Future() noexcept = default;
    // 析构函数
    ~Future();

    // 禁用拷贝构造函数
    Future(const Future&) = delete;
    // 禁用拷贝赋值运算符
    Future& operator=(const Future&) = delete;

    // 移动构造函数,使用 noexcept 修饰表示不会抛出异常
    Future(Future&& other) noexcept;
    // 移动赋值运算符,使用 noexcept 修饰表示不会抛出异常
    Future& operator=(Future&& other) noexcept;

    /**
     * @brief 获取值
     *
     * 此函数的行为应与相应的 std::future 函数相同
     *
     * @returns 类型为 T 的值
     * @error 域:错误 通过 Promise::SetError 放入相应 Promise 中的错误
     *
     */
    T get();

    /**
     * @brief 获取结果
     *
     * 与 get()类似,此调用会阻塞直到值或错误可用。不过,此调用永远不会抛出异常
     *
     * @returns 包含值或错误的 Result
     * @error 域:错误 通过 Promise::SetError 放入相应 Promise 中的错误
     *
     */
    Result<T, E> GetResult() noexcept;

    /**
     * @brief 检查 Future 是否有效,即是否具有共享状态
     *
     * 此函数的行为应与相应的 std::future 函数相同
     *
     * @returns 如果 Future 可用则返回 true,否则返回 false
     */
    bool valid() const noexcept;

    /**
     * @brief 等待值或错误变为可用
     *
     * 此函数的行为应与相应的 std::future 函数相同
     */
    void wait() const;

    /**
     * @brief 等待给定的时间段,或者直到值或错误变为可用
     *
     * 此函数的行为应与相应的 std::future 函数相同
     *
     * @param timeoutDuration 要等待的最大持续时间
     * @returns 表示是超时还是值可用的状态
     */
    template <typename Rep, typename Period>
    future_status wait_for(const std::chrono::duration<Rep, Period>& timeoutDuration) const;

    /**
     * @brief 等待直到给定的时间,或者直到值或错误变为可用
     *
     * 此函数的行为应与相应的 std::future 函数相同
     *
     * @param deadline 要等待的最晚时间点
     * @returns 表示是否到达时间或值是否可用的状态
     */
    template <typename Clock, typename Duration>
    future_status wait_until(const std::chrono::time_point<Clock, Duration> deadline) const;

    /**
     * @brief 注册一个可调用对象,当 Future 准备好时调用该对象
     *
     * 当调用 @a func 时,保证 get()和 GetResult()不会阻塞
     *
     * @a func 可以在此调用的上下文中调用,也可以在 Promise::set_value()或 Promise::SetError()或其他地方的上下文中调用
     *
     * @a then 的返回类型取决于 @a func 的返回类型(也称为延续)
     *
     * 设 U 为延续的返回类型(即与 std::result_of_t<std::decay_t<F>(Future<T,E>)>等效的类型)
     * - 如果 U 对于某些类型 T2、E2 是 Future<T2,E2>,那么 @a then()的返回类型是 Future<T2,E2>。这称为隐式 Future 展开
     * - 如果 U 对于某些类型 T2、E2 是 Result<T2,E2>,那么 @a then()的返回类型是 Future<T2,E2>。这称为隐式 Result 展开
     * - 否则它是 Future<U,E>
     *
     * @param func 要注册的可调用对象
     * @returns 延续结果的新 Future 实例
     */
    template <typename F>
    auto then(F&& func) -> Future<SEE_COMMENT_ABOVE>;

    /**
     * @brief 返回异步操作是否已完成
     *
     * 如果此函数返回 true,则保证 get()、GetResult()和等待调用不会阻塞
     *
     * 如果 valid()返回 false,则此函数的行为未定义
     *
     * @returns 如果 Future 包含值或错误则返回 true,否则返回 false
     */
    bool is_ready() const;
};

ara::core::GetResult ()ara::core::Future 对象中返回结果(Result)或者错误(Error),并且不会抛出异常。get () 返回相应的 ara::core::Future  并且 / 或者抛出异常。

有关自适应平台中错误处理方法的详细文档,请参阅 [Specification of Adaptive Platform Core.pdf] 中 “错误处理” 章节。

下面是使用 “基于异常” 的方法来同步调用一个方法的示例:

using namespace ara::com;

int main() {
    // 一些获取句柄的代码
    //...
    RadarServiceProxy service(handle);
    // 通过服务的 Calibrate 方法(传入 myConfigString 参数)调用,得到一个包含 Calibrate::Output 类型的 Future 对象
    Future<Calibrate::Output> callFuture = service.Calibrate(myConfigString);

    /**
     * 现在我们进行一个阻塞式的 get()调用,当接收到结果(有效结果或者异常)时,该调用将会返回。
     *
     * 如果 Calibrate 方法可能抛出异常并且服务端已经设置了异常,那么这个异常将会通过 get()抛出
     */
    Calibrate::Output callOutput = callFuture.get();

    // 对得到的 callOutput 进行处理...
    return 0;
}

简而言之:从开发人员的角度来看,对服务方法的同步调用仅仅包含()操作符调用语法,以及随后对返回的 future (同步 / 异步结果)进行阻塞式的 get () 调用。除了从对 get () 的阻塞调用中恢复执行之外,一旦方法结果可用,用户还有其他方式从通信管理实现中获得通知:

  • wait” 的变体,ara::core::Future std::future 中继承了这些变体。它们主要提供了阻塞等待 future 完成的功能。

  • 通过 then()注册一个回调方法。这是对 std::future  的扩展之一;详见  [Specification of Adaptive Platform Core.pdf]

简单的无参数的 wait() 变体与 get () 具有相同的阻塞语义,即阻塞直到 future 有一个有效的结果(值或异常)。 “wait” 的变体,你要么给出一个持续时间( wait_for())要么给出一个目标时间点( wait_until()),如果  future 有一个有效的结果或者超时 / 最后期限限制已到,它们就会返回 —— 因此它们都返回 future_status 以区分这些情况。 获得  future 结果(有效或异常)通知的最后一种可能性是通过 then()注册一个回调方法。这是  ara::core::future std::future  的扩展之一。

如你所见,到目前为止我们讨论的(并且在示例中部分展示了)获取 future 方法结果的所有可能性 —— 阻塞式的 “get”、所有 “wait” 变体和 “then”—— 都是事件驱动的。也就是说,方法结果(或错误)的到达事件要么导致被阻塞的用户线程恢复执行,要么导致对用户提供的函数的调用!

当然,有些情况下,ara::com用户根本不希望他的应用程序(进程)被某些方法调用返回事件激活!想象一个典型的实时(RT)应用程序,它必须完全控制自己的执行。我们已经在事件数据访问的上下文中讨论了这个实时 / 轮询用例(小节 5.3.5.3)。对于方法调用,同样的方法也适用!

因此,我们预见到了与  ara::core::future 相关的以下使用模式:通过()操作符调用服务方法后,只需使用 ara::core::Future::is_ready () 进行轮询,以查看方法调用是否已经完成。此调用被定义为非阻塞的。当然,它可能涉及一些系统调用 / 上下文切换(例如查看一些内核缓冲区),这并不是无代价的,但它不会阻塞!在ara::core::Future::is_ready () 返回 true 之后,可以保证下一次对 ara::core::Future::get () 的调用不会阻塞,而是在没有错误的情况下立即返回有效的值,或者在出现错误的情况下抛出异常。

5.3.6.3 Canceling Method Result

在某些情况下,你可能已经通过()操作符调用了一个服务方法,该方法返回了一个  ara::core::future ,但你已经不再关心结果了。

甚至可能你已经通过 ara::core::Future::then() 为它注册了一个回调。与其放任不管并 “忽略” 这个回调,你应该明确地告知通信管理(Communication Management)。

这样可以释放资源,并避免在绑定实现层面产生不必要的处理负载。要告知你不再对方法调用结果感兴趣,只需让  ara::core::Future  超出作用域,这样它的析构函数(destructor)就会被调用。

调用  ara::core::Future  的析构函数是向绑定实现发出的一个信号,表示不应再调用为此  future 注册的任何回调,方法调用结果的预留 / 分配内存可以被释放,并且方法结果的事件等待机制应该停止。

显然,为了触发对析构函数的调用,你可以让  future 超出作用域。根据应用程序架构的不同,这可能并不可行,因为你可能已经将返回的  ara::core::Future  分配给了某个作用域更大的变量。

为了解决这个问题, ara::core::Future 是可默认构造的。因此,你可以像下面的示例所示,简单地用一个默认构造的实例覆盖变量中返回的  ara::core::Future 

using namespace ara::com;

// 定义一个存储 Calibrate::Output 类型的 Future 对象
Future<Calibrate::Output> calibrateFuture;

int main() {
    // 一些获取句柄的代码
    //...
    RadarServiceProxy service(handle);
    // 调用服务的 Calibrate 方法(传入 myConfigString 参数),并将返回的 Future 对象赋值给 calibrateFuture
    calibrateFuture = service.Calibrate(myConfigString);

    /**
     * 发生了一些状态改变,使得 calibrate 方法的结果变得多余了...
     * 
     * 我们通过将变量重置为一个新的默认构造的 Future 对象来强制删除(原来的 Future 对象)
     */
    calibrateFuture = Future<Calibrate::Output>();

    // 继续执行其他操作...
    return 0;
}

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

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

相关文章

人工智能快速发展下的极端风险管理

文章目录 前言一、快速进步与高风险并存1、深度学习系统缺乏关键功能&#xff0c;其开发周期尚不明朗2、自主人工智能系统一旦导向不良目标&#xff0c;人类可能面临其失控风险 二、技术研发方向调整1、实现安全人工智能的基础性突破&#xff0c;确保人工智能可靠安全2、实现有…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

Python Selenium 自动化爬虫 + Charles Proxy 抓包

一、场景介绍 我们平常会遇到一些需要根据省、市、区查询信息的网站。 1、省市查询 比如这种&#xff0c;因为全国的省市比较多&#xff0c;手动查询工作量还是不小。 2、接口签名 有时候我们用python直接查询后台接口的话&#xff0c;会发现接口是加签名的。 而签名算法我…

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

计算机人工智能前沿进展-大语言模型方向-2024-09-20

计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…

[数据集][目标检测]智慧交通铁轨裂缝检测数据集VOC+YOLO格式4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2709 标注数量(xml文件个数)&#xff1a;2709 标注数量(txt文件个数)&#xff1a;2709 标注…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

将sqlite3移植到arm开发板上:

一、下载源代码 sqlite3网址&#xff1a;https://www.sqlite.org/download.html 下载&#xff1a;sqlite-autoconf-3460100.tar.gz 二、解压 在Linux家目录下创建一个sqlite3文件夹&#xff0c;将压缩包复制到该文件夹下&#xff0c;再在该目录下打开一个终端&#xff0c;执行…

【Linux】简易日志系统

目录 一、概念 二、可变参数 三、日志系统 一、概念 一个正在运行的程序或系统就像一个哑巴&#xff0c;一旦开始运行我们很难知晓其内部的运行状态。 但有时在程序运行过程中&#xff0c;我们想知道其内部不同时刻的运行结果如何&#xff0c;这时一个日志系统可以有效的帮…

【路径规划】 红嘴蓝鹊优化器:一种用于2D/3D无人机路径规划和工程设计问题的新型元启发式算法

摘要 本文提出了一种新型元启发式算法——红嘴蓝鹊优化器&#xff08;RBMO&#xff09;&#xff0c;用于解决2D和3D无人机路径规划以及复杂工程设计问题。RBMO灵感来源于红嘴蓝鹊的群体合作行为&#xff0c;包括搜索、追逐、捕猎和食物储藏。该算法通过模拟这些行为&#xff0…

prober found high clock drift,Linux服务器时间不能自动同步,导致服务器时间漂移解决办法。

文章目录 一、场景二、问题三、解决办法&#xff08;一&#xff09;给服务器添加访问网络能力&#xff08;二&#xff09;手动同步1. 检查有没有安装ntp2. 没有安装ntp则离线安装ntp2.1 下载安装包2.2 安装2.3 启动 ntp 3. 设置内部时钟源3.1 编辑/etc/ntp.conf3.1 重启ntp服务…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…

【C++】关键字auto详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、类型别名思考 三、auto简介 四…

python 运行其他命令行工具,实时打印输出内容

起因&#xff0c; 目的: python 运行一个命令&#xff0c;最简洁的写法是: import os # 转换视频格式。 cmd "ffmpeg -i a1.ts -c copy a1.mp4"os.system(cmd)问题&#xff1a; 如果上面的视频比较大&#xff0c;需要运行很长时间&#xff0c;那么感觉就像是卡住…

向日葵和这三款远程控制神器,让你轻松掌控一切!

向日葵远程控制&#xff0c;作为科技控们的最佳良伴&#xff0c;一定是我们居家、办公必备的神器啦&#xff01;别看咱们工作、学习有时候烦得心都碎成了二八瓣&#xff0c;但有了向日葵远程控制&#xff0c;咱们的效率绝对能飞起来&#xff01;今天&#xff0c;咱们就一起走进…