pRTI中的testfederate例子分析
来源:互联网 发布:mac pro 2016 发布时间 编辑:程序博客网 时间:2024/05/18 03:56
从pitch公司下载的testfederate例子代码不全,很多菜单响应函数都被注释掉了,直接去掉注释会出现很多编译错误。因此,不建议使用那个例子。
本文中例子是从http://www.mitre.org/tech/hla_book/ 下载的最新的testfederate例子,此代码齐全,可以编译运行。
编译运行此例子的步骤如下:
1 在path环境变量下加入jdk的bin目录,同时在classpath环境变量下加入lib/prti.jar;
2 运行C:/Program Files/prti1516/samples/book/src>javac org/mitre/hla/book/test_federate/*.java命令编译程序,注意此命令是在src作为当前目录的情况下执行的。
3 直接在C:/Program Files/prti1516/samples/book目录下运行rti.bat和testfed.bat两个批处理文件,注意修改批处理文件,把jre程序换成java程序。
--------------------------------------------------------------------------------------------------------------
此例子加入GUI,用户可以通过菜单执行方式测试。基本的结构跟Chat例子很相似:所有federate都使用同样的一个程序,通过不同的joinFederateExecution来产生不同的联邦。
FED文件不是xml格式的,而是书上提到的那种格式。
源代码中对不同的菜单项进行了编号,因此很容易找到其对象的处理逻辑。基本上所有的菜单响应都分成三部分:
第一部分,在TestFederateFrame.java中通过addActionListener函数加入对菜单项的处理函数,比如
createFedExMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
createFedEx_Action(e);
}
});
第二部分,在TestFederateFrame.java中的消息响应函数,比如createFedEx_Action:
void createFedEx_Action(ActionEvent event)
{
StringsDialogProxy proxy = new StringsDialogProxy();
String[] labels = {
"Federation execution name:",
"FED:"
};
String[] defaults = {
"restaurant_1",
""};
//file:/c://mydocu~1//hla//book//code//config//fed_example.fed
BrowserFactory[] browsers = {null, _fileBrowser};
int result = proxy.queryUser(
this,
"Create Federation Execution",
labels,
defaults,
browsers);
if (result == StringsDialog.CANCEL) return;
else if (result == StringsDialog.OK) {
String[] stuff = proxy.results();
_impl.createFederationExecution(stuff);
}
else {
post("StringsDialog returned " + result);
}
}
(3)订阅/发布机制的实现
与此有关的菜单项有9个,表示为5.x。需要注意的是,这里的大多数功能都需要预先知道对象属性的handle。因此,需要先调用10.x相关功能获取特定属性的handle。
比如,我们可以先通过10.2功能获取某对象类的handle,比如输入ObjectRoot.Restaurant将能得到餐馆对象类的handle。这里注意输入对象类名字时,需要输入全路径。即从根对象类输入直到所要获取handle的对象类。
然后,可以通过10.4功能获取某对象类属性的handle,比如输入对象类handle为2,输入属性名字为position,则可以得到position属性的handle为100.
此时,我们已经获取到了需要的对象类和属性的handle,就可以进行发布和订阅的配置了。比如,调用5.2功能,输入对象类handle为2,输入属性handle为100,就可以得到发布对象类2的100号属性,即position属性。同理,可以调用5.6功能,订阅对象类2的100号属性。可以看到,RTI将调用发布联邦的回调函数(在FedAmbImpl.java中)startRegistrationForObjectClass,通知该联邦,有别的联邦已经订阅了它方法发布的属性position。
(4)属性的更新和反射
前面我们已经进行了属性的发布和订阅,接下来就可以进行属性值的更新和反射了。注意, 在属性值更新和反射之前,我们还需要注册对象实例。因为,只有对象实例才有属性值。此时,调用6.2功能注册对象实例,输入对象类句柄为2.则注册成功后,订阅此属性的联邦将被回调discoverObjectInstance函数,得到别的联邦所注册的对象实例句柄,102。
然后就可以调用6.4功能进行属性值的更新,输入参数为实例handle为102,属性句柄为100,值为xxxxx,则RTI将调用订阅该属性的联邦的回调函数reflectAttributeValues来通知属性值的更新。
(5)时间管理
这里以时间推进为例。首先在第一个联邦中调用8.2功能,使其变为可以发出TSO事件的联邦(local time为0,lookahead为0.2)。此举将使RTI调用回调函数timeRegulationEnabled进行确认。
然后在第二个联邦中调用8.5功能,使其改变为时间受限联邦。此举将使RTI调用回调函数timeConstrainedEnabled进行确认。
然后在第一个联邦中调用8.8TAR,请求时间推进到0.2,第二个联邦中调用8.8TAR,请求时间推进到0.5。则第一个联邦中会被RTI调用回调函数time adv grant,确认时间可以推进到0.2.此时第二个联邦时间还是不能推进,因为0.2+0.2=0.4还是小于0.5。若第一个联邦再次调用8.8TAR,请求时间推进到0.4,则第一个联邦将会被RTI调用回调函数time adv grant,确认时间可以推进到0.4,此时第二个联邦也被调用回调)time adv grant,确认时间可以推进到0.5.
关于时间管理,请看运行截图
- pRTI中的testfederate例子分析
- pRTI中的chat例子的Java版分析
- 对餐馆例子中的manager联邦成员的代码分析
- 关于 Demo_Ocean 例子的分析(修改cg中的参数)
- 自定义Loader的实现---ApiDemos中的LoaderCustom例子分析
- 计算机仿真中的HLA技术中的餐馆例子分析 (1) Production
- 计算机仿真中的HLA技术中的餐馆例子分析 (2) Transport
- 计算机仿真中的HLA技术中的餐馆例子分析 (3)Viewer
- 计算机仿真中的HLA技术中的餐馆例子分析 (4) Consumption
- ortp分析之一 例子分析
- ortp分析之一 例子分析
- ortp分析之一 例子分析
- shoutcast 例子分析
- Matlab具体例子分析
- Struts2例子详细分析
- osgkeyboardMouse例子分析
- pthread_cond_wait例子分析
- MTKSocket例子分析
- UNIX编程环境(The UNIX Programming Environment) 备忘录(四)
- Ubuntu右上角的网络连接图标消失了
- 职业人士日常学习的四个方法
- 常用算法总结之排序(七)---直接插入排序
- 统计自然语言处理---信息论基础
- pRTI中的testfederate例子分析
- Altium Designer 8.0
- 朋友们啊
- Linux文件基本操作
- 在Linux中创建静态库和动态库
- jsp中forward方法与sendRedirect方法的区别
- Change the BLACK background of datawindow on column moving and mouse selection
- 传智播客---文件上传下载系统
- equals ==