protected override void OnLeave(Random r, CPEvent evt) { evt.Team.AddPhase(this, GetItem(evt)); }
protected void UpdateNext() { m_next = null; foreach (var e in Process) if (m_next == null || e.Time < m_next.Time) m_next = e.evt; }
private void ProcessNextPhase(Random r, CPEvent evt) { Node next; Links.TryGetValue(evt.Team.Grade, out next); if (next == null) throw new Exception(String.Format("Обрыв цепочки на этапе '{0}', PType='{1}', для класса {2}", Name, PType, evt.Team.Grade)); next.AddTeam(r, evt.Team, evt.Time); }
protected virtual void OnLeave(Random r, CPEvent evt) { var item = GetItem(evt); evt.Team.AddPhase(this, item); ProcessNextPhase(r, evt); }
// команда хочет начать работать protected virtual void OnTryStart(Random r, CPEvent evt) { var logItem = GetItem(evt); if (!Unlimited && Channels > 0 && Process.Count(it => it.Working) >= Channels) Wait.Enqueue(logItem); else OnStart(r, logItem); UpdateMaxLoad(); }
protected virtual void OnEnd(Random r, CPEvent evt) { var item = GetItem(evt); LogTeam(item); if (Wait.Any()) // запустили первого из стоящих в очереди { var e = Wait.Dequeue(); e.evt.Time = evt.Time; OnStart(r, e); } item.After = Scale(Times.After, 1.0 * item.Work.TotalMinutes / Times.Mean.TotalMinutes); // как поработали, так и тормозим // !!! item.evt.Time += item.After; item.evt.EType = EventType.Leave; AddItem(item); }
// команда появляется на этапе protected virtual void OnAppear(Random r, CPEvent evt) { CheckStart(evt.Time); var item = new LogItem(evt); item.Before = Scale(Times.Before, item.Team.Smartness); // !!! evt.EType = EventType.Start; evt.Time += item.Before; AddItem(item); }
protected LogItem GetItem(CPEvent evt) { var logItem = Process.FirstOrDefault(it => it.evt == evt); if (logItem == null) throw new Exception(String.Format("На этапе {0} нет команды {1}", Name, evt.Team.Name)); Process.Remove(logItem); UpdateNext(); return logItem; }
public virtual void ProcessEvent(Random r, CPEvent evt) { switch (evt.EType) { case EventType.Appear: // подготовиться и встать на отсечку OnAppear(r, evt); break; case EventType.Start: // стартовать OnTryStart(r, evt); break; case EventType.End: // закончить работу OnEnd(r, evt); break; case EventType.Leave: // потормозить в конце OnLeave(r, evt); break; } }
public LogItem(CPEvent e) { Appear = e.Time; evt = e; }