Ejemplo n.º 1
0
 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();
     }
 }
Ejemplo n.º 2
0
        /* ПРОЦЕССОР - обработчик текущего процесса за каждый тик*/
        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();         // инициализация текущего процесса и процесс добавлен на ВЫПОЛНЕНИЕ
            }
        }