예제 #1
0
        /// <summary>
        /// Usado para criar a árvore
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public int CompareTo(object obj)
        {
            Processo auxProcesso = (Processo)obj;

            if (this.PID < auxProcesso.PID)
            {
                return(-1);
            }
            else if (this.PID == auxProcesso.PID)
            {
                return(0);
            }
            else
            {
                return(1);
            }
        }
예제 #2
0
        /// <summary>
        /// Simula a execução de um processo, sendo que sua prioridade é o seu tempo de quantum
        /// </summary>
        /// <param name="processo">Processo que será executado</param>
        /// <returns>Retorna 1, se o processo completou sua execução
        /// Retorna -1, se o processo NÃO completou a sua execução</returns>
        public int Run(Processo processo)
        {
            int aux = 1; // representa quanto tempo passou

            while (aux <= processo.Prioridade && processo.QtdeCiclos > 0)
            {
                processo.DiminuirQtdeCiclos();
                Thread.Sleep(Controle.tempoSegundosQuantum * 1000); //Simula o tempo gasto pela CPU, em segundos
                aux++;
            }

            if (processo.QtdeCiclos == 0)
            {
                return(1);
            }
            else
            {
                processo.DiminuirPrioridade();
            }

            return(-1);
        }
예제 #3
0
        public static void Leitura_Arquivo()
        {
            if (!File.Exists(nomeArquivo))
            {
                //Exibir mensagem de erro "Arquivo não foi encontrado ou não existe."

                return;
            }

            //Fazer a leitura do arquivo e organizar entre as 10 filas
            using (StreamReader entrada = new StreamReader(nomeArquivo))
            {
                string[] info;

                while (!entrada.EndOfStream)
                {
                    info = entrada.ReadLine().Split(';');
                    try
                    {
                        if (info.Length == 4)
                        {
                            Processo processo = new Processo(Convert.ToInt32(info[0]), info[1], Convert.ToInt32(info[2]), Convert.ToInt32(info[3]));
                            escalonador.AdicionarProcesso(processo);
                            InserirListViewPrioridades(processo);
                        }
                        else
                        {
                            //Exibir mensagem de erro "falta atributos"
                        }
                    }
                    catch (Exception erro)
                    {
                        //Exibir mensagem de erro de conversão
                    }
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Simula a execução do escalonador
        /// </summary>
        public void Run()
        {
            CPU cpu = new CPU();
            int pos = 0;

            while (!TodosVazia() && pos < TodasFilasProcessos.Length) // Enquanto todas as filas de processos não estiverem vazias
            {
                while (!TodasFilasProcessos[pos].Vazio())             // Enquanto uma fila especifica não estiver vazia
                {
                    //Retirar da fila e da listView
                    Monitor.Enter(this);

                    Processo processo = (Processo)(TodasFilasProcessos[pos].Retirar());

                    if (processo == null) //alguma thread ficou presa dentro do while RESOLVER ISSO
                    {
                        break;
                    }

                    Controle.RetirarListViewPrioridades(processo);

                    if (Thread.CurrentThread.Name == Controle.thread_cpu0.Name)
                    {
                        Controle.TrocarLabel("Rodando: " + processo.Nome, 0);
                    }
                    else if (Thread.CurrentThread.Name == Controle.thread_cpu1.Name)
                    {
                        Controle.TrocarLabel("Rodando: " + processo.Nome, 1);
                    }

                    Monitor.Exit(this);

                    int reposta = cpu.Run(processo);

                    Monitor.Enter(this);
                    if (reposta < 0)
                    {
                        //não terminou
                        AdicionarProcesso(processo);
                        Controle.InserirListViewPrioridades(processo);
                    }
                    else if (reposta == 0)
                    {
                        //suspendeu
                        AdicionarProcesso(processo);
                        Controle.InserirListViewPrioridades(processo);
                    }
                    else
                    {
                        //terminou
                        Controle.InserirListViewPronto(processo);
                    }
                    Monitor.Exit(this);
                }
                pos++;
            }

            if (Thread.CurrentThread.Name == Controle.thread_cpu0.Name)
            {
                Controle.TrocarLabel("Fim", 0);
            }
            else if (Thread.CurrentThread.Name == Controle.thread_cpu1.Name)
            {
                Controle.TrocarLabel("Fim", 0);
            }

            System.Windows.Threading.Dispatcher.Run();
        }