Пример #1
0
        /// <summary>
        /// Обработка Освободить оба канала
        /// </summary>
        public static void ReleaseChannelAll_EventHandler(Event e)
        {
            Device.Release(Channels.AllChannels);

            Device.TaskQueue = Device.TaskQueue.OrderByDescending(t => t.Priority).ToList(); // Без  этого лучше работает (Не сортируем по приоритетам)
            var firstTask = Device.TaskQueue.FirstOrDefault();

            if (firstTask == null) // В очереди нет задач
            {
                return;
            }

            if (firstTask.Type != TaskTypes.ClassC) // В очереди задача класса А или Б
            {
                Device.TaskQueue.RemoveFirstTask();
                firstTask.PopQueueTime = ModelingTime; //Время извлечения задачи из очереди
                Device.Seize(firstTask, Channels.Channel1);
                FileLines.AddWithTime("Берем из очереди задачу " + firstTask.Type + ". Занимаем канал 1");
                PlanEvent(EventCode.ReleaseChannel1,
                    Generator.ExpDistribution(firstTask.Type, GeneratorParametrs.Advance) + ModelingTime, firstTask.Type);

                var secondTask = Device.TaskQueue.FirstOrDefault(); // Берем вторую задачу из очереди

                if (secondTask == null)
                {
                    return;
                }

                if (secondTask.Type == TaskTypes.ClassC)
                {
                    FileLines.AddWithTime("Нехватает каналов для задачи класса С");
                    return;
                }

                Device.TaskQueue.RemoveFirstTask();
                secondTask.PopQueueTime = ModelingTime; //Время извлечения задачи из очереди
                Device.Seize(secondTask, Channels.Channel2);
                FileLines.AddWithTime("Берем из очереди задачу " + secondTask.Type + ". Занимаем канал 2");
                PlanEvent(EventCode.ReleaseChannel2,
                    Generator.ExpDistribution(secondTask.Type, GeneratorParametrs.Advance) + ModelingTime,
                    secondTask.Type);
            }
            else
            {
                Device.TaskQueue.RemoveFirstTask();
                firstTask.PopQueueTime = ModelingTime; //Время извлечения задачи из очереди
                Device.Seize(firstTask, Channels.AllChannels);
                FileLines.AddWithTime("Берем из очереди задачу " + firstTask.Type + ". Занимаем оба канала");
                PlanEvent(EventCode.ReleaseChannelAll,
                    Generator.ExpDistribution(firstTask.Type, GeneratorParametrs.Advance) + ModelingTime,
                    firstTask.Type);
            }
        }
Пример #2
0
        /// <summary>
        /// Обработка поступления задачи
        /// </summary>
        public static void TaskGen_EventHandler(Event e)
        {
            var task = GetTaskInstanceByType(e.TaskType);

            var firsTaskQueue = Device.TaskQueue.OrderByDescending(t => t.Priority).FirstOrDefault();
            var IsFirstTaskC = false;
            if (firsTaskQueue != null)
            {
                IsFirstTaskC = firsTaskQueue.Type == TaskTypes.ClassC;
            }

            if (TaskTypes.ParallelCkasses.Contains(e.TaskType)) // Задачи класса A и B
            {
                if (IsFirstTaskC || (!Device.IsChannelAvailable(Channels.Channel1) && !Device.IsChannelAvailable(Channels.Channel2)))
                {
                    switch (e.TaskType)
                    {
                        case TaskTypes.ClassA:
                            Device.TaskQueue.AddTask(task);
                            break;
                        case TaskTypes.ClassB:
                            Device.TaskQueue.AddTask(task);
                            break;
                    }

                    FileLines.AddWithTime(string.Format("Задача {0} добавлена в очередь. В очереди {1} елемент(ов)",
                        e.TaskType, Device.TaskQueue.Count));
                }
                else
                {
                    if (Device.IsChannelAvailable(Channels.Channel1))
                    {
                        Device.Seize(task, Channels.Channel1);
                        FileLines.AddWithTime("Занять канал 1 задачей " + e.TaskType);
                        PlanEvent(EventCode.ReleaseChannel1, Generator.ExpDistribution(e.TaskType, GeneratorParametrs.Advance) + ModelingTime, e.TaskType);
                    }
                    else if (Device.IsChannelAvailable(Channels.Channel2))
                    {
                        Device.Seize(task, Channels.Channel2);
                        FileLines.AddWithTime("Занять канал 2 задачей " + e.TaskType);
                        PlanEvent(EventCode.ReleaseChannel2, Generator.ExpDistribution(e.TaskType, GeneratorParametrs.Advance) + ModelingTime, e.TaskType);
                    }
                }
            }
            else // Задачи класса C
            {
                if (Device.IsChannelAvailable(Channels.Channel1) && Device.IsChannelAvailable(Channels.Channel2))
                {
                    Device.Seize(task, Channels.AllChannels);
                    FileLines.AddWithTime("Занять оба канала задачей " + e.TaskType);

                    PlanEvent(EventCode.ReleaseChannelAll, Generator.ExpDistribution(e.TaskType, GeneratorParametrs.Advance) + ModelingTime, e.TaskType);
                }
                else
                {
                    Device.TaskQueue.AddTask(task);
                    FileLines.AddWithTime(string.Format("Задача {0} добавлена в очередь. В очереди {1} елемент(ов)", e.TaskType, Device.TaskQueue.Count));
                }
            }

            Device.QueueLengthSum += Device.TaskQueue.Count; // Для расчета средней длины очереди
            PlanEvent(EventCode.TaskGen, Generator.ExpDistribution(e.TaskType, GeneratorParametrs.Generation) + ModelingTime, e.TaskType);
        }
Пример #3
0
 /// <summary>
 /// Обработка Освободить канал 2
 /// </summary>
 public static void ReleaseChannel2_EventHandler(Event e)
 {
     ReleaseChannel(Channels.Channel2);
 }
Пример #4
0
 /// <summary>
 /// Обработка поступления задачи
 /// </summary>
 public static void StopModeling_EventHandler(Event e)
 {
     Console.WriteLine("Моделирование завершено");
     Console.WriteLine("Время моделирования: " + ModelingTime);
 }