public void LeaveApp(RequestForServ DelApp)
        {
            //Сбор статистики
            Statistic.BT_Common += mainForm.TS - DelApp.ArrivalTime;
            Statistic.BT[ID]    += mainForm.TS - DelApp.ArrivalTime; //количество выполненных заявок
            Statistic.TC[ID]++;                                      //Суммарное время обслуживания
            if (ID == mainForm.DeviceList.Count)
            {
                Statistic.TC_Common++;
            }
            Active_Apps.Remove(DelApp);
            FreeChannels += DelApp.ChannelNeeds[ID];
            if (Active_Apps.Count == 0)
            {
                Busy       = false;
                ChangeTime = mainForm.TS;
            }
            mainForm.Log.Add("Время: " + DelApp.EndTime + "; Событие: Заявка: " + DelApp.ID.ToString() + " закончила обслуживание на устройстве: " + ID.ToString());
            RequestForServ appl = Q.Pop(FreeChannels, ID);//получение заявки из очереди

            if (appl != null)
            {
                mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + appl.ID.ToString() + " вышла из очереди устройства: " + ID.ToString());
                AddReq(appl);
            }
        }
 public static void AddEvent(double time, RequestForServ rec)
 {
     Event e = new Event();
     e.IsNew = true;
     e.time = time;
     e.Request = rec;
     Events.Add(e);
     Events.Sort(Compare);
 }
 public static void AddEvent(double time, int PhNum, RequestForServ Appl)
 {
     Event e = new Event();
     e.IsNew = false;
     e.time = time;
     e.TekDevice = PhNum;
     e.Request = Appl;
     Events.Add(e);
     Events.Sort(Compare);
 }
        public static void AddEvent(double time, RequestForServ rec)
        {
            Event e = new Event();

            e.IsNew   = true;
            e.time    = time;
            e.Request = rec;
            Events.Add(e);
            Events.Sort(Compare);
        }
        public static void AddEvent(double time, int PhNum, RequestForServ Appl)
        {
            Event e = new Event();

            e.IsNew     = false;
            e.time      = time;
            e.TekDevice = PhNum;
            e.Request   = Appl;
            Events.Add(e);
            Events.Sort(Compare);
        }
Exemple #6
0
        private RequestForServ GenNewRequest()
        {
            RequestForServ r = NewRequest;

            if (!StopGen)
            {
                KolReq++;
                NewRequest             = new RequestForServ(KolReq);
                NewRequest.ArrivalTime = mainG.nextDouble() + r.ArrivalTime;
                EventList.AddEvent(NewRequest.ArrivalTime, NewRequest);
            }
            return(r);
        }
        public void AddReq(RequestForServ NewApp)
        {
            Statistic.GeneralQueryValue[ID] += NewApp.ChannelNeeds[ID];
            Statistic.QueryCount[ID]++;
            if (Channels < NewApp.ChannelNeeds[ID])
            {
                Statistic.PullApps[ID]++;
                mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Исключение: rоличество запрашиваемых каналов заявкой " + NewApp.ID + " превышает количество доступных");

            }
            else
            {
                if (FreeChannels < NewApp.ChannelNeeds[ID])//отправляем в очередь устройства
                {
                    Q.Push(NewApp);
                    mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + NewApp.ID + " встала в очередь устройства: " + ID.ToString());
                }
                else// отправляем заявыку на обслуживание
                {
                    if (!NewApp.WasInQueue)
                    {

                        Statistic.NotWaitApps[ID]++;
                    }
                    else
                    {
                        Statistic.HT[ID] += mainForm.TS - NewApp.WaitTime;
                        Statistic.SW2[ID] += (mainForm.TS - NewApp.WaitTime) * (mainForm.TS - NewApp.WaitTime);
                    }
                    if (Busy)
                    {
                        Statistic.BusyTime[ID] += mainForm.TS - ChangeTime;
                    }
                    else
                    {
                        Busy = true;
                    }
                    ChangeTime = mainForm.TS;
                    FreeChannels -= NewApp.ChannelNeeds[ID];

                    NewApp.ArrivalTime = mainForm.TS;
                    Statistic.BusyChanCount[ID] += (Channels - FreeChannels) * (mainForm.TS - LastTimeBusyChanChanged);
                    LastTimeBusyChanChanged = mainForm.TS;
                    NewApp.EndTime = mainForm.TS + Dist.nextDouble();//время конца обработки заявки
                    EventList.AddEvent(NewApp.EndTime, ID, NewApp);//снова добавили в список событий
                    Active_Apps.Add(NewApp);
                    mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + NewApp.ID + " встала на обслуживание на устройстве: " + ID.ToString());
                }
            }
        }
        public void AddReq(RequestForServ NewApp)
        {
            Statistic.GeneralQueryValue[ID] += NewApp.ChannelNeeds[ID];
            Statistic.QueryCount[ID]++;
            if (Channels < NewApp.ChannelNeeds[ID])
            {
                Statistic.PullApps[ID]++;
                mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Исключение: rоличество запрашиваемых каналов заявкой " + NewApp.ID + " превышает количество доступных");
            }
            else
            {
                if (FreeChannels < NewApp.ChannelNeeds[ID])//отправляем в очередь устройства
                {
                    Q.Push(NewApp);
                    mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + NewApp.ID + " встала в очередь устройства: " + ID.ToString());
                }
                else// отправляем заявыку на обслуживание
                {
                    if (!NewApp.WasInQueue)
                    {
                        Statistic.NotWaitApps[ID]++;
                    }
                    else
                    {
                        Statistic.HT[ID]  += mainForm.TS - NewApp.WaitTime;
                        Statistic.SW2[ID] += (mainForm.TS - NewApp.WaitTime) * (mainForm.TS - NewApp.WaitTime);
                    }
                    if (Busy)
                    {
                        Statistic.BusyTime[ID] += mainForm.TS - ChangeTime;
                    }
                    else
                    {
                        Busy = true;
                    }
                    ChangeTime    = mainForm.TS;
                    FreeChannels -= NewApp.ChannelNeeds[ID];

                    NewApp.ArrivalTime           = mainForm.TS;
                    Statistic.BusyChanCount[ID] += (Channels - FreeChannels) * (mainForm.TS - LastTimeBusyChanChanged);
                    LastTimeBusyChanChanged      = mainForm.TS;
                    NewApp.EndTime = mainForm.TS + Dist.nextDouble(); //время конца обработки заявки
                    EventList.AddEvent(NewApp.EndTime, ID, NewApp);   //снова добавили в список событий
                    Active_Apps.Add(NewApp);
                    mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + NewApp.ID + " встала на обслуживание на устройстве: " + ID.ToString());
                }
            }
        }
        public void Push(RequestForServ NewApp)
        {
            if (Size == -1 || ReqInQ < Size)
            {
                Statistic.STL[ID] += (mainForm.TS - LastChangeTime) * ReqInQ;
                LastChangeTime     = mainForm.TS;

                NewApp.WasInQueue = true;
                NewApp.WaitTime   = mainForm.TS;
                Statistic.CountQueueApps[ID]++;
                ReqInQ++;
                if (MaxLengh > ReqInQ)
                {
                    MaxLengh = ReqInQ;
                }
                Queue.Add(NewApp);
            }
            else
            {
                Statistic.PullApps[ID]++;
                mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Исключение: очередь переполнена, заявка " + NewApp.ID + " вытолкнута с обслуживания");
            }
        }
Exemple #10
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(tbRequestNumber.Text))
            {
                MaxReq = Convert.ToInt32(tbRequestNumber.Text);
            }
            if (!string.IsNullOrEmpty(tbWorkTime.Text))
            {
                MaxTime = Convert.ToInt32(tbWorkTime.Text);
            }
            mainG = DistList[Convert.ToInt32(cmbGeneratorDistribution.Text) - 1];

            NewRequest             = new RequestForServ(KolReq);
            NewRequest.ArrivalTime = mainG.nextDouble();
            EventList.AddEvent(NewRequest.ArrivalTime, NewRequest);
            bool  stop = false;
            Event CurReq;

            while (!stop)
            {
                CurReq = EventList.GetClosest();
                Console.WriteLine(CurReq.Request.ID);
                TS = CurReq.time;
                if (CurReq.IsNew)
                {
                    Log.Add("Время: " + TS.ToString() + ". Поступила новая завка с номером: " + CurReq.Request.ID);
                    KolObrRec++;
                    DeviceList[0].AddReq(GenNewRequest());//получаем новую заявку и записываем ее в список
                    if (KolObrRec == MaxReq)
                    {
                        StopGen = true;
                    }
                }
                else
                {
                    CurReq.Request.WasInQueue = false;
                    Console.WriteLine(CurReq.Request.ID);
                    Console.WriteLine(CurReq.TekDevice);
                    DeviceList[CurReq.TekDevice - 1].LeaveApp(CurReq.Request);//уходим с устройства на котором были
                    if (CurReq.TekDevice == DeviceList.Count)
                    {
                        if (chbClosedSystem.Checked)
                        {
                            DeviceList[0].AddReq(CurReq.Request);
                        }
                        else
                        {
                            Log.Add("Заявка " + CurReq.Request.ID + " вышла из системы");
                        }
                    }
                    else
                    {
                        DeviceList[CurReq.TekDevice].AddReq(CurReq.Request);
                    }
                }
                stop = stop || (EventList.Events.Count <= 0) || (MaxTime > 0) && (MaxTime <= TS);
            }

            foreach (string s in Log)
            {
                lbLog.Items.Add(s);
            }
            ToStat();
        }
        public RequestForServ Pop(int ChannelNeeds, int Dev)
        {
            bool           run = true;
            RequestForServ res = null;

            if (ReqInQ > 0)
            {
                int n;
                switch (Type)
                {
                case "FIFO":
                    n   = -1;
                    run = true;
                    while (run && n < ReqInQ)
                    {
                        n++;
                        if (n < ReqInQ)
                        {
                            run = (Queue[n].ChannelNeeds[Dev] > ChannelNeeds);
                        }
                    }
                    if (n == ReqInQ)
                    {
                        res = null;
                    }
                    else
                    {
                        res = Queue[n];
                        Queue.RemoveAt(n);
                    }
                    break;

                case "LIFO":
                    n = Queue.Count;

                    while (run && n >= 0)
                    {
                        n--;
                        if (n >= 0)
                        {
                            run = Queue[n].ChannelNeeds[ID] > ChannelNeeds;
                        }
                    }
                    if (n == -1)
                    {
                        res = null;
                    }
                    else
                    {
                        res = Queue[n];
                        Queue.RemoveAt(n);
                    }
                    break;

                case "PRIORITET":
                    n = 0;
                    int maxpr = Queue[0].Priority;
                    for (int i = 1; i < Queue.Count; i++)
                    {
                        if (Queue[i].Priority > maxpr)
                        {
                            maxpr = Queue[i].Priority;
                            n     = i;
                        }
                    }
                    res = Queue[n];
                    Queue.RemoveAt(n);
                    break;
                }
                Statistic.STL[ID] += (mainForm.TS - LastChangeTime) * ReqInQ;
                LastChangeTime     = mainForm.TS;
                Statistic.QueuePassedApps[ID]++;
                ReqInQ--;
            }
            return(res);
        }
 public void LeaveApp(RequestForServ DelApp)
 {
     //Сбор статистики
     Statistic.BT_Common += mainForm.TS - DelApp.ArrivalTime;
     Statistic.BT[ID] += mainForm.TS - DelApp.ArrivalTime;//количество выполненных заявок
     Statistic.TC[ID]++;//Суммарное время обслуживания
     if (ID == mainForm.DeviceList.Count)
     {
         Statistic.TC_Common++;
     }
     Active_Apps.Remove(DelApp);
     FreeChannels += DelApp.ChannelNeeds[ID];
     if (Active_Apps.Count == 0)
     {
         Busy = false;
         ChangeTime = mainForm.TS;
     }
     mainForm.Log.Add("Время: " + DelApp.EndTime + "; Событие: Заявка: " + DelApp.ID.ToString() + " закончила обслуживание на устройстве: " + ID.ToString());
     RequestForServ appl = Q.Pop(FreeChannels, ID);//получение заявки из очереди
     if (appl != null)
     {
         mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Событие: Заявка: " + appl.ID.ToString() + " вышла из очереди устройства: " + ID.ToString());
         AddReq(appl);
     }
 }
 private RequestForServ GenNewRequest()
 {
     RequestForServ r = NewRequest;
     if (!StopGen)
     {
         KolReq++;
         NewRequest = new RequestForServ(KolReq);
         NewRequest.ArrivalTime = mainG.nextDouble() + r.ArrivalTime;
         EventList.AddEvent(NewRequest.ArrivalTime, NewRequest);
     }
     return r;
 }
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(tbRequestNumber.Text)) MaxReq = Convert.ToInt32(tbRequestNumber.Text);
            if (!string.IsNullOrEmpty(tbWorkTime.Text)) MaxTime = Convert.ToInt32(tbWorkTime.Text);
            mainG = DistList[Convert.ToInt32(cmbGeneratorDistribution.Text) - 1];

            NewRequest = new RequestForServ(KolReq);
            NewRequest.ArrivalTime = mainG.nextDouble();
            EventList.AddEvent(NewRequest.ArrivalTime, NewRequest);
            bool stop = false;
            Event CurReq;

            while (!stop)
            {
                CurReq = EventList.GetClosest();
                Console.WriteLine(CurReq.Request.ID);
                TS = CurReq.time;
                if (CurReq.IsNew)
                {
                    Log.Add("Время: " + TS.ToString() + ". Поступила новая завка с номером: " + CurReq.Request.ID);
                    KolObrRec++;
                    DeviceList[0].AddReq(GenNewRequest());//получаем новую заявку и записываем ее в список
                    if (KolObrRec == MaxReq) StopGen = true;
                }
                else
                {
                    CurReq.Request.WasInQueue = false;
                    Console.WriteLine(CurReq.Request.ID);
                    Console.WriteLine(CurReq.TekDevice);
                    DeviceList[CurReq.TekDevice - 1].LeaveApp(CurReq.Request);//уходим с устройства на котором были
                    if (CurReq.TekDevice == DeviceList.Count)
                    {
                        if (chbClosedSystem.Checked)
                        {
                            DeviceList[0].AddReq(CurReq.Request);
                        }
                        else Log.Add("Заявка " + CurReq.Request.ID + " вышла из системы");
                    }
                    else
                    {
                        DeviceList[CurReq.TekDevice].AddReq(CurReq.Request);
                    }
                }
                stop = stop || (EventList.Events.Count <= 0) || (MaxTime > 0) && (MaxTime <= TS);
            }

            foreach (string s in Log)
                lbLog.Items.Add(s);
            ToStat();
        }
        public void Push(RequestForServ NewApp)
        {
            if (Size == -1 || ReqInQ < Size)
            {
                Statistic.STL[ID] += (mainForm.TS - LastChangeTime) * ReqInQ;
                LastChangeTime = mainForm.TS;

                NewApp.WasInQueue = true;
                NewApp.WaitTime = mainForm.TS;
                Statistic.CountQueueApps[ID]++;
                ReqInQ++;
                if (MaxLengh > ReqInQ)
                    MaxLengh = ReqInQ;
                Queue.Add(NewApp);
            }
            else
            {
                Statistic.PullApps[ID]++;
                mainForm.Log.Add("Время: " + mainForm.TS.ToString() + "; Исключение: очередь переполнена, заявка " + NewApp.ID + " вытолкнута с обслуживания");
            }
        }