예제 #1
0
파일: Phase.cs 프로젝트: se-ti/queueing
 protected override void OnLeave(Random r, CPEvent evt)
 {
     evt.Team.AddPhase(this, GetItem(evt));
 }
예제 #2
0
파일: Phase.cs 프로젝트: se-ti/queueing
 protected void UpdateNext()
 {
     m_next = null;
     foreach (var e in Process)
         if (m_next == null || e.Time < m_next.Time)
             m_next = e.evt;
 }
예제 #3
0
파일: Phase.cs 프로젝트: se-ti/queueing
        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);
        }
예제 #4
0
파일: Phase.cs 프로젝트: se-ti/queueing
        protected virtual void OnLeave(Random r, CPEvent evt)
        {
            var item = GetItem(evt);
            evt.Team.AddPhase(this, item);

            ProcessNextPhase(r, evt);
        }
예제 #5
0
파일: Phase.cs 프로젝트: se-ti/queueing
        // команда хочет начать работать
        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();
        }
예제 #6
0
파일: Phase.cs 프로젝트: se-ti/queueing
        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);
        }
예제 #7
0
파일: Phase.cs 프로젝트: se-ti/queueing
        // команда появляется на этапе
        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);
        }
예제 #8
0
파일: Phase.cs 프로젝트: se-ti/queueing
 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;
 }
예제 #9
0
파일: Phase.cs 프로젝트: se-ti/queueing
        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;
            }
        }
예제 #10
0
파일: Phase.cs 프로젝트: se-ti/queueing
 public LogItem(CPEvent e)
 {
     Appear = e.Time;
     evt = e;
 }