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->ObjFloor OriFloor) 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->ObjFloor OriFloor) 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