See
- The definition simprocess.h
- The description Simulation process
<project-file type=“source”/>
<content> #include “simagent.h” #include “simprocess.h”
std::list<SimEventLogger*> SimProcess::EventLoggers;
SimQuitEvent::SimQuitEvent(float time)
: SimSchedule(time)
{ }
SimQuitEvent::~SimQuitEvent() { }
void SimQuitEvent::handler(float Time, SimProcess *process) {
if (process != NULL) process->quit();
}
SimProcess::SimProcess(std::ostream &log) : SimAgent(0), Logger(log) { }
SimProcess::~SimProcess() { }
void SimProcess::run() {
Time=0; Quit=false; while (!Quit) { float time = eventTime(); if (time > Time) Time = time; handler(Time, this); idle(); }
}
void SimProcess::quit() {
Quit=true;
}
void SimProcess::idle() { }
void SimProcess::registerAgent(SimAgent *agent) {
if (agent == NULL) return; std::map<SimID, SimAgent*>::iterator i=RegisteredAgents.find(agent->id()); if (i != RegisteredAgents.end()) i->second = agent; else RegisteredAgents[agent->id()] = agent;
}
void SimProcess::unregisterAgent(SimAgent *agent) {
if (agent == NULL) return; std::map<SimID, SimAgent*>::iterator i=RegisteredAgents.find(agent->id()); if (i != RegisteredAgents.end()) RegisteredAgents.erase(i);
}
SimAgent *SimProcess::agentWithID(const SimID &id) {
std::map<SimID, SimAgent*>::iterator i=RegisteredAgents.find(id); if (i != RegisteredAgents.end()) return i->second; return NULL;
}
void SimProcess::registerEventLogger(SimEventLogger *logger) {
if (logger == NULL) return; std::list<SimEventLogger*>::iterator i; for (i = EventLoggers.begin(); i != EventLoggers.end() && *i != logger; i++); if (i == EventLoggers.end()) EventLoggers.push_back(logger);
}
void SimProcess::unregisterEventLogger(SimEventLogger *logger) {
if (logger == NULL) return; std::list<SimEventLogger*>::iterator i; for (i = EventLoggers.begin(); i != EventLoggers.end() && *i != logger; i++); if (i != EventLoggers.end()) EventLoggers.erase(i);
}
void SimProcess::log(float time, SimAgent *agent, SimSchedule *event) {
std::list<SimEventLogger*>::iterator i; for (i = EventLoggers.begin(); i != EventLoggers.end(); i++) if ((*i)->loggable(event)) (*i)->log(this, time, agent, event);
} </content> <use name=“simprocess.h”/>