/// <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); } }
/// <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); }
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 } } } }
/// <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(); }