示例#1
0
        protected override void ExecuteTask()
        {
            CurrentTime += Convert.ToInt16(Tick * (1 - ExecutePart));
            var tempTime = CurrentTime;

            while (tempTime < CurrentTime + Convert.ToInt16(Tick * ExecutePart))
            {
                var task = ListOfTasks.Find(t => t.State != "done" && t.Appear < tempTime);

                // No not done task in a queue found
                if (null == task)
                {
                    SystemWaitsGenTime++;
                    tempTime++;
                    continue;
                }

                ListOfSequence.Add(task.Index.ToString());

                // Task was not processed before
                if (task.State == "wait")
                {
                    task.Start = tempTime;
                    task.State = "process";
                }

                // Left less time than needed for a task
                if (task.LeftToProcess > CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime)
                {
                    task.LeftToProcess -= CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime;
                    return;
                }

                // Task can be done until the end of tick
                tempTime          += task.LeftToProcess;
                task.LeftToProcess = 0;
                task.Finish        = tempTime;
                task.State         = "done";
            }
        }
示例#2
0
        protected override void ExecuteTask()
        {
            CurrentTime += Convert.ToInt16(Tick * (1 - ExecutePart));
            var tempTime = CurrentTime;

            while (tempTime < CurrentTime + Convert.ToInt16(Tick * ExecutePart))
            {
                var task = ListOfTasks.Find(t => t.State != "виконано" && t.Appear < tempTime);

                // якщо в черзі немає заявок, що очікують виконання
                if (null == task)
                {
                    SystemWaitsGenTime++;
                    tempTime++;
                    continue;
                }

                ListOfSequence.Add(task.Index.ToString());

                // якщо заявка знаходиться в стані очікування
                if (task.State == "очікування")
                {
                    task.Start = tempTime; //почати обробку
                    task.State = "обробка";
                }

                // якщо залишилось менше часу, ніж потрібно для виконання заявки
                if (task.LeftToProcess > CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime)
                {
                    task.LeftToProcess -= CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime;
                    return;
                }

                tempTime          += task.LeftToProcess;
                task.LeftToProcess = 0;
                task.Finish        = tempTime;
                task.State         = "виконано";
            }
        }
        protected override void ExecuteTask()
        {
            var tempTime = CurrentTime;

            while (tempTime < CurrentTime + Convert.ToInt16(Tick * ExecutePart))
            {
                // Task was interrupted during last quantum
                TaskItem task;
                if (_leftOfQuantum < _quantum && -1 != _currentTask)
                {
                    task = ListOfTasks.Find(t => t.Index == _currentTask);
                    ListOfSequence.Add(task.Index.ToString());

                    // Task needs less, than a quantum
                    if (task.LeftToProcess < _leftOfQuantum)
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);

                        task.LeftToProcess = 0;
                        task.State         = "done";
                        task.Finish        = tempTime;
                    }

                    // Task cannot be done during this quantum
                    else
                    {
                        tempTime           += _leftOfQuantum;
                        task.LeftToProcess -= _leftOfQuantum;

                        UpdateWaitOption(_quantum, task.Index, tempTime);
                    }
                }
                _leftOfQuantum = _quantum;

                task = ListOfTasks.Find(t => t.State != "done" && t.Index > _currentTask && t.Appear < tempTime);

                // No task in a queue after index is found
                if (null == task)
                {
                    _currentTask = -1;
                    SystemWaitsGenTime++;
                    tempTime++;
                    continue;
                }

                ListOfSequence.Add(task.Index.ToString());
                _currentTask = task.Index;

                // Task was not processed before
                if (task.State == "wait")
                {
                    task.Start = tempTime;
                    task.State = "process";
                    task.Wait  = task.Start - task.Appear;
                }

                // More than a quantum is left
                if (tempTime < CurrentTime + Tick * ExecutePart - _quantum)
                {
                    // Task needs more time than a quantum
                    if (task.LeftToProcess > _quantum)
                    {
                        task.LeftToProcess -= _quantum;
                        tempTime           += _quantum;

                        UpdateWaitOption(_quantum, task.Index, tempTime);
                    }

                    // Task can be done during next quantum
                    else
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);

                        task.LeftToProcess = 0;
                        task.State         = "done";
                        task.Finish        = tempTime;
                    }
                }

                // Less time than a quantum until the end of tick is left
                else
                {
                    // Task needs even less time than left until end of tick
                    if (task.LeftToProcess < CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime)
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);

                        task.LeftToProcess = 0;
                        task.State         = "done";
                        task.Finish        = tempTime;
                    }

                    // Task will be interrupted
                    else
                    {
                        _leftOfQuantum = _quantum + tempTime - CurrentTime - Convert.ToInt16(Tick * ExecutePart);

                        task.LeftToProcess += _leftOfQuantum - _quantum;

                        UpdateWaitOption(_quantum - _leftOfQuantum,
                                         task.Index, CurrentTime + Convert.ToInt16(Tick * ExecutePart));

                        _currentTask = task.Index;
                        return;
                    }
                }
            }
        }
示例#4
0
        protected override void ExecuteTask()
        {
            var tempTime = CurrentTime;

            while (tempTime < CurrentTime + Convert.ToInt16(Tick * ExecutePart))
            {
                // якщо заявка не встигла завершитись за відведений квант часу
                Task task;
                if (_leftOfQuantum < _quantum && -1 != _currentTask)
                {
                    task = ListOfTasks.Find(t => t.Index == _currentTask);
                    ListOfSequence.Add(task.Index.ToString());

                    // якщо заявку можливо виконати за поточний квант часу
                    if (task.LeftToProcess < _leftOfQuantum)
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);
                        //виконати заявку
                        task.LeftToProcess = 0;
                        task.State         = "виконано";
                        task.Finish        = tempTime;
                    }

                    // У протилежному випадку, заявку не можна виконати за квант і вона додається в чергу очікування
                    else
                    {
                        tempTime           += _leftOfQuantum;
                        task.LeftToProcess -= _leftOfQuantum;

                        UpdateWaitOption(_quantum, task.Index, tempTime);
                    }
                }
                _leftOfQuantum = _quantum;

                task = ListOfTasks.Find(t => t.State != "виконано" && t.Index > _currentTask && t.Appear < tempTime);

                // No task in a queue after index is found
                if (null == task)
                {
                    _currentTask = -1;
                    SystemWaitsGenTime++;
                    tempTime++;
                    continue;
                }

                ListOfSequence.Add(task.Index.ToString());
                _currentTask = task.Index;

                // якщо заявка стоїть в черзі на обробку
                if (task.State == "очікуваня")
                {
                    task.Start = tempTime;
                    //розпочати обробку
                    task.State = "обробка";
                    task.Wait  = task.Start - task.Appear;
                }

                // якщо залишилось більше часу, ніж квант
                if (tempTime < CurrentTime + Tick * ExecutePart - _quantum)
                {
                    // якщо заявка потребує більше, ніж квант часу
                    if (task.LeftToProcess > _quantum)
                    {
                        task.LeftToProcess -= _quantum;
                        tempTime           += _quantum;

                        UpdateWaitOption(_quantum, task.Index, tempTime);
                    }

                    // Заявка не може бути виконана за квант часу
                    else
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);

                        task.LeftToProcess = 0;
                        task.State         = "виконано";
                        task.Finish        = tempTime;
                    }
                }

                // Якщо до завершення процессу залишилось менше , ніж квант часу
                else
                {
                    // Якщо заявці потрібно менше часу, ніж залишлось до завершення процесу - виконати
                    if (task.LeftToProcess < CurrentTime + Convert.ToInt16(Tick * ExecutePart) - tempTime)
                    {
                        tempTime += task.LeftToProcess;

                        UpdateWaitOption(task.LeftToProcess, task.Index, tempTime);

                        task.LeftToProcess = 0;
                        task.State         = "виконано";
                        task.Finish        = tempTime;
                    }

                    // У протилежному випадку заявку буде перервано
                    else
                    {
                        _leftOfQuantum = _quantum + tempTime - CurrentTime - Convert.ToInt16(Tick * ExecutePart);

                        task.LeftToProcess += _leftOfQuantum - _quantum;

                        UpdateWaitOption(_quantum - _leftOfQuantum,
                                         task.Index, CurrentTime + Convert.ToInt16(Tick * ExecutePart));

                        _currentTask = task.Index;
                        return;
                    }
                }
            }
        }