一、服务方法特性
骨架侧的服务方法是抽象方法,需由继承骨架的服务实现子类重写。以服务示例中的Adjust
方法为例:
struct AdjustOutput
{
bool success;
Position effective_position;
};
virtual ara::core::Future<AdjustOutput> Adjust(const Position& position) = 0;
服务方法抽象定义中的 IN-parameters 映射到方法参数,此例中Position
类型的position
参数因是非基本类型被建模为 “const ref”。服务方法的实现必须返回ara::core::Future
,以避免在服务调用实际处理分派到中央工作线程池时出现阻塞线程,影响多核 CPU 的有效使用。返回的ara::core::Future
包含聚合服务调用所有输出参数的模板参数结构。
二、Adjust
方法的两种实现变体
(一)同步处理变体
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) {
//... 实现
}
};
(二)异步处理变体
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) {
//... 实现
}
};
三、单向(One-Way)又名即发即忘(Fire-and-Forget)方法
签名更简单,是一个不需要向调用者提供反馈的简单void
方法:
virtual void LogCurrentState() = 0;
四、引发应用程序错误
当服务方法实现检测到应用程序错误时,将错误码存储到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::ErrorCode
promise.SetError(SpecificErrorsErrc::InvalidConfigString);
}
else
{
//...
}
// 我们返回一个可能设置了异常的未来
return future;
}
private:
bool checkConfigString(const std::string& config);
std::string curValidConfig_;
};
标签:core,AutoSar,const,CM,ara,AP,promise,Position,position
From: https://blog.csdn.net/weixin_42108533/article/details/142930565