说我有两个Redhawk组件。组件1具有称为“抽头”的属性。组件2还需要知道“抽头”的值。如果组件2可以查找组件1的“ taps”值,而不是赋予它自己的“ taps”值,则事情将变得容易得多。组件2如何访问组件1的属性?我正在用C ++实现这些组件。
我使用以下代码尝试了resource port。
int NeedsProperties_i::serviceFunction(){
CF::Properties otherProperties;
otherProperties.length(1);
otherProperties[0].id = "name";
resourceOut->query(otherProperties);
std::cout << "name: " << any_to_string(otherProperties[0].value) <<
std::endl;
sleep(1);
return NORMAL;
}
std::string NeedsProperties_i::any_to_string(CORBA::Any value) {
std::ostringstream result;
const char* tmp;
value >>= tmp;
result << tmp;
return result.str();
}
NeedsProperties在这种情况下是组件2,它正试图从另一个组件获取属性“名称”。 NeedsProperties的输出资源端口“ resourceOut”已连接到组件。无论资源端口是否连接,该代码仅输出空字符串。这里发生了什么?另外,资源端口是否是实现此目的的好方法,还是有更好的实现方法?
答案 0 :(得分:0)
使用REDHAWK 2.1.3,我可以使用示例代码从组件2成功查询组件1(具有ID为“名称”的属性)。
要注意的两件事是,您将从查询中获取不存在的属性时发生异常-Component1是否具有ID为“ name”的属性?如果尝试从属性中解组错误的类型,则将没有任何价值。使用 ossie :: any_to_string()帮助程序是取消编组简单CORBA对象的首选方法。
替代实现将使用PropertyChangeListeners。当“属性”获得新值时,将生成并发布一个事件供任何人抓取。在Component2中,您需要从PropertyChangeListener继承,使用Component1上属性的 id 调用registerPropertyChangeListener()并处理更改事件。您可以查看 redhawk / src / testing / tests / test_08_PropertyChange * .py 了解处理PropertyChangeEvent的python代码。
答案 1 :(得分:0)
尝试一下:
int NeedsProperties_i::serviceFunction(){
CF::Properties otherProperties;
otherProperties.length(1);
otherProperties[0].id = CORBA::string_dup("name");
if(resourceOut->isActive()){
resourceOut->query(otherProperties);
std::cout << "name: " << any_to_string(otherProperties[0].value) <<
std::endl;
sleep(1);
return NORMAL;
}else{
sleep(1);
return NOOP;
}
}
答案 2 :(得分:0)
上述代码的问题是,我已将“ NeedsProperties”的输出资源端口连接到我在创建的其他组件上的“ 我自己的”输入资源端口。您应该将输出端口连接到另一个组件上的“棒棒糖”。它是名字中突出的那个小圆点。
不过,谢谢您的回答。