AutoSar AP中Proxy Class中Methods描述的总结
☞ 返回总目录
5.3.6 Methods(方法)
Proxy Class 与方法包装类
-
代理类与方法成员:对于远程服务的每种方法,Proxy Class 包含特定于该方法的包装类成员。例如示例中有 Calibrate、Adjust 和 LogCurrentState 三种方法对应的成员。代理类的方法类在特定命名空间 methods 中生成,而 methods 包含在代理命名空间内,代理中的方法成员用于调用远程服务实例提供的方法。
-
方法包装类的构成:以 Adjust 方法为例,其包装类不复杂,由两部分组成。
- 内部结构定义:如 Adjust 方法中的 Output 结构体,用于汇总方法的输出(OUT)/ 输入输出(INOUT)参数。
- 括号运算符重载:用于调用服务方法,它将服务方法的所有输入(IN)/ 输入输出(INOUT)参数作为输入(IN)参数包含在内,并且在 ara::com API 中会把抽象服务方法描述中的 INOUT 参数拆分为一对 IN 和 OUT 参数。
-
非单向方法的返回值:对非 “单向方法” 调用的返回值是一个 ara::core::Future,模板参数是汇总方法所有输出(OUT)参数的内部结构类型。
5.3.6.1 One - Way aka Fire - and - Forget Methods(单向方法)
- 单向方法的特点:ara::com 支持 “单向(one - way)” 或 “发射后不管(fire - and - forget)” 方法。这种方法只有输入(IN)参数,没有输出(OUT)参数,不允许引发错误,无法与服务器进行握手 / 同步,客户端 / 调用者无法得知服务器是否处理了该调用。从资源角度看,这种方法在某些通信模式中是轻量级的。
5.3.6.2 Event - Driven vs Polling access to method results(事件驱动与轮询访问方法结果)
-
API 支持与核心类:与事件数据访问类似,为基于事件驱动和轮询的方法提供了 API 支持来访问服务方法调用结果,核心类是 ara::core::Future,它是 C++11/C++14 std::future 类的扩展版本。
-
事件驱动机制:在事件驱动中,一旦方法调用结果到达,带有代理实例的应用程序作为方法调用者会被 ara::com 实现(Communication Management implementation)通知。ara::com 实现通过设置等待机制(WaitEvent),在方法结果可用时唤醒机制来通知用户。
-
Future 类的接口:
- 枚举类型 future_status:定义了 ready(共享状态已准备好)和 timeout(在指定超时时间过去之前共享状态未准备好)两种状态。
- 模板类 Future:
- 构造与赋值:提供了默认构造函数、移动构造函数,禁用了拷贝构造函数和拷贝赋值运算符。
- 获取值与结果:get () 函数获取类型为 T 的值,GetResult () 函数获取包含值或错误的 Result,两者行为与 std::future 函数类似,但 GetResult () 不会抛出异常。
- 检查有效性:valid () 函数检查 Future 是否具有共享状态。
- 等待机制:wait () 函数等待值或错误变为可用;wait_for () 函数等待给定时间段直到值或错误可用;wait_until () 函数等待直到给定时间点直到值或错误可用,后两者会根据情况返回 future_status。
- 注册可调用对象:then () 函数注册一个可调用对象,当 Future 准备好时调用,其返回类型根据注册函数的返回类型确定。
- 检查异步操作是否完成:is_ready () 函数返回异步操作是否完成。
-
使用示例与调用方式:
- 基于异常的同步调用示例:在示例中,通过获取服务句柄,使用服务代理对象的 Calibrate 方法调用得到 Future 对象,然后进行阻塞式的 get () 调用获取结果。
- 多种获取结果的方式:除了阻塞式的 get () 调用外,还有多种获取结果的方式,如不同变体的 wait () 函数,以及通过 then () 注册回调方法。这些方式都是事件驱动的,方法结果的到达事件会导致用户线程恢复执行或调用用户提供的函数。对于一些实时(RT)应用程序,可能不希望被方法调用返回事件激活,此时可以通过 ara::core::Future::is_ready () 进行轮询查看方法调用是否完成,此调用是非阻塞的。
5.3.6.3 Canceling Method Result(取消方法结果)
- 取消结果的操作:当不再关心通过()操作符调用服务方法返回的 ara::core::future 的结果时,应明确告知通信管理。可以让 ara::core::Future 超出作用域使析构函数被调用,或者在某些情况下(如将返回的 Future 对象分配给了更大作用域的变量),可以用默认构造的实例覆盖变量中的 Future 对象来达到释放资源、停止方法结果的事件等待机制等目的。