예제 #1
0
        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);
        }
예제 #2
0
 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
         }
     });
 }
예제 #3
0
        /// <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);
            }
        }