📄 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: <Top Level>
//## 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]<shortest)
{
shortest = distance[i];
ret = i;
}
}
}
if(ret>=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<msg->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<msg->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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -