⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulation.cpp

📁 一个用HLA编写的聊天程序
💻 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 + -