private void AddProcessesToIdleProcessors(int numToAdd) { var processors = Processors; var idlingProcessors = processors.Where(processor => processor.IsIdling); var idlingProcessorsAsList = idlingProcessors.ToList(); foreach (var processor in idlingProcessorsAsList) { if (ProcessProducer.CanProduce(numToAdd)) { processor.AddToLocalQueue(ProcessProducer.ProduceProcesses(numToAdd, processor.CurrentClockCycle)); } else if (!ProcessProducer.IsDoneProducing) { var leftoverProcesses = ProcessProducer.ProcessesCanProduce; processor.AddToLocalQueue( ProcessProducer.ProduceProcesses(leftoverProcesses, processor.CurrentClockCycle)); } else if (ProcessProducer.IsDoneProducing) { break; } } Processors.RemoveAll(processor => processor.IsIdling); Processors.AddRange(idlingProcessorsAsList); }
public Storage() { /* -= Инициализация жестких дисков =- */ HardDiscs.AddRange(new HardDisc[] { new HardDisc { Name = "Seagate", Price = 2459, Size = 2 }, new HardDisc { Name = "Western Digital", Price = 2599, Size = 2 }, new HardDisc { Name = "Western Digital", Price = 3129, Size = 2 }, new HardDisc { Name = "Apacer", Price = 2653, Size = 2 } }); /* -= Инициализация процессоров =- */ Processors.AddRange(new Processor[] { new Processor { Name = "Intel Core i9", Price = 31896 }, new Processor { Name = "Intel Core i7", Price = 10720 }, new Processor { Name = "Intel Core i5", Price = 6055 } }); /* -= Инициализация материнских плат =- */ MotherBoards.AddRange(new MotherBoard[] { new MotherBoard { Name = "Asus", Price = 4061 }, new MotherBoard { Name = "MSI", Price = 3878 }, new MotherBoard { Name = "Gigabyte", Price = 3658 }, }); /* -= Инициализация мониторов =- */ Screens.AddRange(new Screen[] { new Screen { Name = "Samsung", Price = 4899 }, new Screen { Name = "Philips", Price = 4199 } }); }
/// <summary> /// The core management method. /// </summary> protected virtual void StartInternal() { if (MaxProcessorCount > Processors.Count) { Processors.AddRange(new TaskProcessor[MaxProcessorCount - Processors.Count]); } while (true) { Console.Clear(); long totalCost = 0; bool empty = true; for (var i = 0; i < Processors.Count; i++) { if (Processors[i] == null) { Processors[i] = new TaskProcessor(); Processors[i].TaskManager = this; } var proc = Processors[i]; if (MaxProcessorCount < Processors.Count && !proc.IsRunning) { Processors.RemoveAt(i--); } if (proc.IsRunning) { proc.Task.Log(); empty = false; } totalCost += proc.Cost; } if (!Tasks.IsEmpty) { empty = false; for (var i = 0; i < Processors.Count && totalCost < MaxCost && !Tasks.IsEmpty; i++) { var proc = Processors[i]; if (!proc.IsRunning) { proc.Start(Tasks.DeQueue()); totalCost += proc.Cost; } } } if (empty) { OnTaskEmpty?.Invoke(); } Thread.Sleep(UpdateInterval); } }