📄 simulation.cpp
字号:
//simulation.cpp: the implementation of the simulation process
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Global.h"
#include "MainFrm.h"
#include "Resource.h"
#include "ChatView.h"
RTI::RTIambassador RtiAmb;
CFederate Fed;
RTIfedTime GrantTime(0.000000);
RTI::Boolean TimeAdvGrant = RTI::RTI_FALSE;
CChatView* pView = NULL;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
UINT simulation(LPVOID pParam)
{
try{
pView = (CChatView*)pParam;
//创建与加入联邦
Fed.CreateFederation();
Fed.JoinFederation();
//"恰当性建议"开关,可选项,用于通知成员注册实例
Fed.EnableAttributeRelevanceAdvisorySwitch();
//初始化RTI
Fed.InitRTI();
//公布和订购
Fed.PublishAndSubscribe();
//设置时间管理策略
Fed.InitializeTimeManagement();
//设置异步传输
Fed.EnableAsynchronousDelivery();
//{{FW_NOTE_BEGIN
// 1) 调用Fed.Register()实现公布对象类实例的注册,用户需先自己创建该对象类的实例,
// 同时创建后的实例用户应调用Fed.m_Pub_Objs.Add(...)进行存储
// 2) 调用CPub_Obj::CreateAndRegisterObject(...)实现公布对象类的注册,该对象类的实例不需
// 用户创建,由框架自动创建并返回该实例的指针,但是用户需调用Fed.m_Pub_Objs.Add(...)进行存储
// 此时用户不应再调用Fed.Register()函数进行重复注册
//}}FW_NOTE_END
int k;
//创建对象实例
CPub_Person* Pub_Person = NULL;
for(k=0;k<1;k++)
{
Pub_Person=new CPub_Person;
Fed.m_Pub_Persons.Add(Pub_Person);
}
//注册对象类实例
Fed.Register();
//{{FW_NOTE_BEGIN
// 用户在以下循环加入仿真过程(以下提供参考步骤)
// 1) 计算时戳值
// 2) 计算对象实体的当前状态
// 3) 产生仿真事件
// 4) 时间推进
// 5) 重复上述过程,直至满足仿真结束条件
//}}FW_NOTE_END
while(pView->SimFlag) {
Fed.m_CurrentTime = GrantTime;
Fed.SetTimeStamp(Fed.GetLookahead() + GrantTime);
Fed.m_NextTime = Fed.m_TimeStep + GrantTime;
//{{FW_NOTE_BEGIN
// 用户可以在此加入处理仿真事件, 以下提供参考例子
//{{FW_REFLECT_ATTRIBUTEVALUES_EXAMPLE_BEGIN
// (a) 查询Fed.m_Sub_Objs是否存在订购的对象类实例(由框架自动创建并存储到该数组)
// (b) 直接通过Fed.m_Sub_Objs获取相应订购的对象类实例指针来得到所需的属性值
//}}FW_REFLECT_ATTRIBUTEVALUES_EXAMPLE_END
//{{FW_RECEIVE_INTERACTION_EXAMPLE_BEGIN
// (a) 当异地成员发送了本地成员所订购的交互类,由RTI通过类CFederateAmbassador产生回调,从而调用
// 各公布的对象类(或类CFederate)函数ProcessReceiveInter(...)
// (b) 用户可以在函数ProcessReceiveInter(...)添加对相应交互类的处理代码
//}}FW_RECEIVE_INTERACTION_EXAMPLE_END
//{{FW_UPDATE_ATTRIBUTEVALUES_EXAMPLE_BEGIN
// (a) 在实例化并注册公布对象类Pub_Obj(以指针形式存在)之后
// (b) 计算该实例的属性值
// (c) 根据模型要求或仿真条件,要更新的属性名存入数组,作为更新函数的参数
// 注:成员根据数组中的属性名打开相应属性的更新开关
// (d) 调用Pub_Obj->UpdateAttributeValues(...)更新该对象类实例的属性值
//}}FW_UPDATE_ATTRIBUTEVALUES_EXAMPLE_END
//{{FW_SEND_INTERACTION_EXAMPLE_BEGIN
// (a) 在实例化公布交互类Send_Inter之后
// (b) 计算该交互类实例的参数值
// (c) 调用Send_Inter.Send(...)发送该交互类实例
//}}FW_SEND_INTERACTION_EXAMPLE_END
// 以上代码,用户可以在各对象类函数Process(...)中实现,此处调用该函数即可
//}}FW_NOTE_END
for(k=0;k<Fed.m_Pub_Persons.GetSize();k++)
{
Fed.m_Pub_Persons[k]->Process(Fed.m_NextTime.getTime());
}
//请求推进到下一时间
Fed.AdvanceTimeRequest(Fed.m_NextTime);
Sleep(100);
}
//删除已公布的对象类实例
Fed.m_NextTime = Fed.m_TimeStep + GrantTime;
Fed.SetTimeStamp(Fed.GetLookahead() + GrantTime);
Fed.DeleteObjInst();
//注销并退出联邦
Fed.ResignFederationExecution();
Fed.DestroyFederationExecution();
}
catch(CString errInfo)
{
if("" != errInfo) {
AfxMessageBox(errInfo);
} else {
return 0;
}
Fed.ResignFederationExecution();
Fed.DestroyFederationExecution();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -