void ManagerOfIO() { if (inOut.stateIO == TStateIO.sprEMPTY) { if (queueOfWait.Count > 0) { inOut.ioRun = queueOfWait[0]; queueOfWait.RemoveAt(0); RefreshQueueOfWait(); QueueOfWait_LB.Refresh(); inOut.stateIO = TStateIO.sprBUSY; inOut.ioRun.descriptor.state = TStateProcess.spRUN; MoveToIO(); } } else { TimerOfIO.Stop(); ToLog(""); ToLog("Очередь ожидания пуста. ", Color.Orange); Processor_TC.TabPages.Clear(); } }
/* ПРОЦЕССОР - обработчик текущего процесса за каждый тик*/ private void TimerOfProcessor_Tick(object sender, EventArgs e) { ++processor.countTick; if (processor.stateProcessor == TStateProcessor.sprBUSY) // процессор работает { if (processor.run.descriptor.state == TStateProcess.spRUN) // обрабатываем команды работающего процесса { again: /*Обработчик команд текущего процесса*/ switch (processor.run.context.command) { case TCommand.cMEMORY: RefreshContext(); // переход на следующую команду TabPage tabPage = Processor_TC.Controls["TabPage" + processor.run.descriptor.PID] as TabPage; ListBox listBox = tabPage.Controls["Process_LB" + processor.run.descriptor.PID] as ListBox; listBox.SetSelected(processor.run.context.currentLine, true); goto again; case TCommand.cPROCESSOR: if ((int)processor.run.context.currentRun < (int)processor.run.context.countRun) // выполнять, пока не истечет время команды ПРОЦЕССОР { // рендер каждого тика GoingP_L.Text = "Выполнено: " + (processor.run.context.currentRun++) + " из " + processor.run.context.countRun.ToString(); } else // если команда ПРОЦЕССОР отработала { processor.run.descriptor.state = TStateProcess.spREADY; // пометка, для отправки процесса менеджером в ГОТОВНОСТЬ ProcessorTick(); // отрисовка результат работы команды ПРОЦЕССОР после выхода из таймера processor.run.context.currentRun = 0; // обнуление счетчика RefreshContext(); // переход на новую команду } break; case TCommand.cIO: processor.run.descriptor.state = TStateProcess.spWAIT; queueOfWait.Add(processor.run); RefreshQueueOfWait(); QueueOfWait_LB.Refresh(); /* Рендер ЛОГА */ ToLog(""); ToLog(processor.run.ToString(), Color.Lime); ToLog(" добавлен в ОЖИДАНИЕ (квант=", Color.White); ToLog(processor.run.descriptor.kvant.ToString(), Color.Lime); ToLog(")", Color.White); Log.Refresh(); processor.run = null; processor.stateProcessor = TStateProcessor.sprEMPTY; if (queueOfWait.Count > 0) { TimerOfIO.Enabled = true; } break; case TCommand.cEND: processor.stateProcessor = TStateProcessor.sprEMPTY; // процессор пуст, так как текущий процесс был удален EndTick(); processor.run = null; // удаление процесса break; default: break; } } else // ожидание события прерывания процесса { ManagerOfProc();// отправка текущего процесса в ВЫПОЛНЕНИЕ } } else // если процессор свободен { ManagerOfProc(); // инициализация текущего процесса и процесс добавлен на ВЫПОЛНЕНИЕ } }