让 redhawk 组件访问另一个组件的属性
have redhawk component access another component's properties
假设我有两个 Redhawk 组件。组件 1 有一个名为 "taps" 的 属性。组件 2 还需要知道 "taps" 的值。如果组件 2 可以查找组件 1 的 "taps" 值,而不是将其自己的 "taps" 值赋给它,事情就会变得容易得多。组件 2 如何访问组件 1 的属性?我正在用 C++ 实现这些组件。
我已经尝试 使用以下代码。
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,并试图从另一个组件获取 属性 "name"。 NeedsProperties 具有连接到组件的输出资源端口 "resourceOut"。无论资源端口是否连接,代码都只打印空字符串。这里发生了什么?另外,资源端口是实现这个的好方法,还是有更好的实现方式?
使用 REDHAWK 2.1.3,我能够使用您的示例代码从组件 2 成功查询组件 1(具有 ID 'name' 的 属性)。
需要注意的两件事是,您将在查询不存在的 属性 时得到异常 - Component1 是否有 ID 为 'name' 的 属性?如果您尝试从 属性 中解组出错误的类型,您将得不到任何值。使用 ossie::any_to_string() 助手是解组简单 CORBA 对象的首选方法。
另一种实现方式是使用 属性ChangeListeners。当 属性 获得新值时,会生成并发布一个事件供任何人获取。在Component2中,需要继承属性ChangeListener,用Component1上属性的id调用register属性ChangeListener(),处理变化事件。您可以看到 redhawk/src/testing/tests/test_08_PropertyChange*.py 用于处理 属性ChangeEvents 的 python 代码。
试试这个:
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;
}
}
我上面的代码的问题是我将 "NeedsProperties" 的输出资源端口连接到我创建的其他组件上的 我自己的 输入资源端口。您应该将输出端口连接到另一个组件上的 "lollipop"。就是名字中突出的那个小点。
感谢您的回答。
假设我有两个 Redhawk 组件。组件 1 有一个名为 "taps" 的 属性。组件 2 还需要知道 "taps" 的值。如果组件 2 可以查找组件 1 的 "taps" 值,而不是将其自己的 "taps" 值赋给它,事情就会变得容易得多。组件 2 如何访问组件 1 的属性?我正在用 C++ 实现这些组件。
我已经尝试
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,并试图从另一个组件获取 属性 "name"。 NeedsProperties 具有连接到组件的输出资源端口 "resourceOut"。无论资源端口是否连接,代码都只打印空字符串。这里发生了什么?另外,资源端口是实现这个的好方法,还是有更好的实现方式?
使用 REDHAWK 2.1.3,我能够使用您的示例代码从组件 2 成功查询组件 1(具有 ID 'name' 的 属性)。
需要注意的两件事是,您将在查询不存在的 属性 时得到异常 - Component1 是否有 ID 为 'name' 的 属性?如果您尝试从 属性 中解组出错误的类型,您将得不到任何值。使用 ossie::any_to_string() 助手是解组简单 CORBA 对象的首选方法。
另一种实现方式是使用 属性ChangeListeners。当 属性 获得新值时,会生成并发布一个事件供任何人获取。在Component2中,需要继承属性ChangeListener,用Component1上属性的id调用register属性ChangeListener(),处理变化事件。您可以看到 redhawk/src/testing/tests/test_08_PropertyChange*.py 用于处理 属性ChangeEvents 的 python 代码。
试试这个:
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;
}
}
我上面的代码的问题是我将 "NeedsProperties" 的输出资源端口连接到我创建的其他组件上的 我自己的 输入资源端口。您应该将输出端口连接到另一个组件上的 "lollipop"。就是名字中突出的那个小点。
感谢您的回答。