www.pudn.com > Elevators.rar > Monitor.cpp


//## begin module%1.3%.codegen_version preserve=yes 
//   Read the documentation to learn more about C++ code generator 
//   versioning. 
//## end module%1.3%.codegen_version 
 
//## begin module%3C12C4F200BE.cm preserve=no 
//	  %X% %Q% %Z% %W% 
//## end module%3C12C4F200BE.cm 
 
//## begin module%3C12C4F200BE.cp preserve=no 
//## end module%3C12C4F200BE.cp 
 
//## Module: Monitor%3C12C4F200BE; Package body 
//## Subsystem:  
//## Source file: D:\Program\OOP\Elevators\SourceCode\Monitor.cpp 
 
//## begin module%3C12C4F200BE.additionalIncludes preserve=no 
//## end module%3C12C4F200BE.additionalIncludes 
 
//## begin module%3C12C4F200BE.includes preserve=yes 
#include "stdafx.h" 
//## end module%3C12C4F200BE.includes 
 
// Monitor 
#include "Monitor.h" 
//## begin module%3C12C4F200BE.declarations preserve=no 
//## end module%3C12C4F200BE.declarations 
 
//## begin module%3C12C4F200BE.additionalDeclarations preserve=yes 
//## end module%3C12C4F200BE.additionalDeclarations 
 
 
// Class CMonitor  
 
 
 
CMonitor::CMonitor() 
  //## begin CMonitor::CMonitor%3C12154C029E_const.hasinit preserve=no 
  //## end CMonitor::CMonitor%3C12154C029E_const.hasinit 
  //## begin CMonitor::CMonitor%3C12154C029E_const.initialization preserve=yes 
  //## end CMonitor::CMonitor%3C12154C029E_const.initialization 
{ 
  //## begin CMonitor::CMonitor%3C12154C029E_const.body preserve=yes 
  //## end CMonitor::CMonitor%3C12154C029E_const.body 
} 
 
CMonitor::CMonitor(const CMonitor &right) 
  //## begin CMonitor::CMonitor%3C12154C029E_copy.hasinit preserve=no 
  //## end CMonitor::CMonitor%3C12154C029E_copy.hasinit 
  //## begin CMonitor::CMonitor%3C12154C029E_copy.initialization preserve=yes 
  //## end CMonitor::CMonitor%3C12154C029E_copy.initialization 
{ 
  //## begin CMonitor::CMonitor%3C12154C029E_copy.body preserve=yes 
	//return *this; 
  //## end CMonitor::CMonitor%3C12154C029E_copy.body 
} 
 
 
CMonitor::~CMonitor() 
{ 
  //## begin CMonitor::~CMonitor%3C12154C029E_dest.body preserve=yes 
	for(int i =0;i<10;i++) 
	{ 
		//GetElevator(i)->get_m_ltMessages().clear(); 
		GetElevator(i)->GetLtPassenger()->clear(); 
	} 
	for(i = 0;i<40;i++) 
	{ 
		GetFloor(i+1)->GetPassengerList()->clear(); 
	} 
	m_pltPassengers->clear(); 
  //## end CMonitor::~CMonitor%3C12154C029E_dest.body 
} 
 
 
CMonitor & CMonitor::operator=(const CMonitor &right) 
{ 
  //## begin CMonitor::operator=%3C12154C029E_assign.body preserve=yes 
	return *this; 
  //## end CMonitor::operator=%3C12154C029E_assign.body 
} 
 
 
int CMonitor::operator==(const CMonitor &right) const 
{ 
  //## begin CMonitor::operator==%3C12154C029E_eq.body preserve=yes 
	return 0; 
  //## end CMonitor::operator==%3C12154C029E_eq.body 
} 
 
int CMonitor::operator!=(const CMonitor &right) const 
{ 
  //## begin CMonitor::operator!=%3C12154C029E_neq.body preserve=yes 
	return 0; 
  //## end CMonitor::operator!=%3C12154C029E_neq.body 
} 
 
 
 
//## Other Operations (implementation) 
int CMonitor::SelectElevator (CMessage* msg) 
{ 
  //## begin CMonitor::SelectElevator%3C131ECA023A.body preserve=yes 
//选梯算法,在方法中监视类根据消息数据,为该请求选择一个合适的电梯 
 
	int distance[10]={-1}; // 这里的距离指的是花费时间的多少. 
	int shortest = 9000;   // 最少时间 
	int ret= -1; 
	for(int i =0;i<10;i++) 
	{ 
		//首先检查该电梯能否提供服务 
		if(m_pElevators[i]->IsQualifiedForRespondingCall(msg)) 
		{ 
			//计算时间距离,从电梯当前位置到乘客当前位置要花费多少时间 
			//包括两个部分: 
			//1. 楼层之间距离乘以电梯的速度 
			//2. 中间需要停留的时间(包括上下电梯的时间) 
			distance[i] = abs(m_pElevators[i]->GetLocation() - msg->OriFloor)*m_S 
				+ m_pElevators[i]->GetStopNums(msg) * m_T; 
			if(distance[i]=0) return ret; 
//如果所有电梯都不能满足条件,原因可能是能否提供服务的条件较苛刻 
// 强制执行E1电梯. 
	else return 1; 
  //## end CMonitor::SelectElevator%3C131ECA023A.body 
} 
 
 
 
bool CMonitor::DispatchMsg (CMessage* msg) 
{ 
  //## begin CMonitor::DispatchMsg%3C13214B00AA.body preserve=yes 
	//监视类对消息的派发. 
	int eid = SelectElevator(msg); // 选梯 
	CElevator* tmp; 
	tmp =GetElevator(eid); 
	tmp->AddMsg(msg); // 把消息送入电梯消息队列. 
	return true; 
  //## end CMonitor::DispatchMsg%3C13214B00AA.body 
} 
 
// Additional Declarations 
  //## begin CMonitor%3C12154C029E.declarations preserve=yes 
CMonitor::CMonitor(int k,int n,int m,int l,int s,int t) 
{ 
	m_K = k; 
	m_N = n; 
	m_M = m; 
	m_L = l; 
	m_S = s; 
	m_T = t; 
	m_pltPassengers = new CPassengerList(); 
	//注意要把电梯和楼层和监视类关联起来 
	m_pElevators[0] = new CElevator(ALL,0,m_S,m_K,m_T); 
	m_pElevators[1] = new CElevator(ALL,1,m_S,m_K,m_T); 
	m_pElevators[2] = new CElevator(UPPART,2,m_S,m_K,m_T); 
	m_pElevators[3] = new CElevator(UPPART,3,m_S,m_K,m_T); 
	m_pElevators[4] = new CElevator(DOWNPART,4,m_S,m_K,m_T); 
	m_pElevators[5] = new CElevator(DOWNPART,5,m_S,m_K,m_T); 
	m_pElevators[6] = new CElevator(EVENS,6,m_S,m_K,m_T); 
	m_pElevators[7] = new CElevator(EVENS,7,m_S,m_K,m_T); 
	m_pElevators[8] = new CElevator(ODDS,8,m_S,m_K,m_T); 
	m_pElevators[9] = new CElevator(ODDS,9,m_S,m_K,m_T); 
	for(int i=0;i<10;i++) 
	{ 
		m_pElevators[i]->set_m_pMonitor(this); 
	} 
	for(i =0;i<40;i++) 
	{ 
		m_pFloors[i] = new CFloor(i+1); 
	} 
	m_iCount=0; 
	m_bFinished = false; 
} 
 
CElevator* CMonitor::GetElevator(int index) 
{ 
	return m_pElevators[index]; 
} 
 
CFloor* CMonitor::GetFloor(int index) 
{ 
	return m_pFloors[index-1]; 
} 
 
CPassengerList* CMonitor::GetPsgList() 
{ 
	return m_pltPassengers; 
} 
CMessage* CMonitor::InquirePassenger(CPassenger *ppas) 
{ 
	// 询问乘客有无请求. 
	if(!ppas->IsEnd()) m_bFinished = false; 
	if(ppas->HasRequest()) 
	{ 
		CMessage* msg; 
		msg = new CMessage(); 
		if(!ppas->IsServed()) 
		{ 
			//乘客的上一个请求没有被满足. 
			//重发该请求 
			msg->PID = ppas->GetPID(); 
			msg->OriFloor = ppas->GetOriFloor(); 
			msg->ObjFloor = ppas->GetObjFloor();//重发请求 
			if(msg->ObjFloorOriFloor) msg->Direction = RDOWN; 
			else msg->Direction = RUP; 
			return msg; 
		} 
		if(ppas->IsCompleted()) 
		{ 
			//乘客已经乘坐完L次,该发出最后一次返回请求 
			msg->PID = ppas->GetPID(); 
			msg->OriFloor = ppas->GetOriFloor(); 
			msg->ObjFloor = 1;//要回到一层结束乘坐 
			ppas->SetObjFloor(1); 
 
			if(msg->ObjFloor==ppas->GetOriFloor()) 
			{ 
				//如果乘客已经到达一层,则不发出请求. 
				ppas->SetStatus(END); 
				return NULL; 
			} 
			else 
			{ 
				if(msg->ObjFloor < msg->OriFloor) msg->Direction = RDOWN; 
				else msg->Direction = RUP; 
				return msg; 
			} 
		} 
		// 以上情况都不满足,按正常请求发送. 
		msg->PID = ppas->GetPID(); 
		msg->OriFloor = ppas->GetOriFloor(); 
		ppas->GenRandFloor(); 
		msg->ObjFloor = ppas->GetObjFloor(); 
		if(msg->ObjFloorOriFloor) msg->Direction = RDOWN; 
		else msg->Direction = RUP; 
		return msg; 
	} 
	else return NULL; 
 
} //## end CMonitor%3C12154C029E.declarations 
//## begin module%3C12C4F200BE.epilog preserve=yes 
//## end module%3C12C4F200BE.epilog