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"; } }
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; } } } }
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; } } } }