/// <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); } }
/// <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); }
/// <summary> /// Обработка Освободить канал 2 /// </summary> public static void ReleaseChannel2_EventHandler(Event e) { ReleaseChannel(Channels.Channel2); }
/// <summary> /// Обработка поступления задачи /// </summary> public static void StopModeling_EventHandler(Event e) { Console.WriteLine("Моделирование завершено"); Console.WriteLine("Время моделирования: " + ModelingTime); }