static void AgregarProceso(String[] parametros) { consoleInfo.lastResult.Clear(); // Limpia el sector de advertencias // Agrega un proceso a la lista. Verificar que Count no sea mayor que 4 if (listaPcb.Count < 4) { try{ Pcb nuevo = new Pcb(); nuevo.quantum = int.Parse(parametros[2]); nuevo.noFuncion = int.Parse(parametros[1]); nuevo.context = new int[] { 1 }; switch (int.Parse(parametros[1])) { case 1: nuevo.funcion_utilizar = new funcion_generica(funcion1); //nuevo.funcion = (() => funcion1()); break; case 2: nuevo.funcion_utilizar = new funcion_generica(funcion2); //nuevo.funcion = (() => funcion2()); break; case 3: nuevo.funcion_utilizar = new funcion_generica(funcion3); //nuevo.funcion = (() => funcion3()); break; default: consoleInfo.lastResult.AppendLine("Función inválida"); break; } if (nuevo.quantum > 10 || nuevo.quantum < 1) { consoleInfo.lastResult.AppendLine("Quantum muy grande o muy pequeño."); } if (consoleInfo.lastResult.Length < 1) { listaPcb.Add(nuevo); consoleInfo.lastResult.Append("Programa añadido"); } } catch { consoleInfo.lastResult.Clear(); consoleInfo.lastResult.AppendLine("Hubo un error procesando su comando"); } } else { consoleInfo.lastResult.Clear(); consoleInfo.lastResult.AppendLine("StAcK oVeRfLoW"); } }
static void ConsoleWriter() { while (encendido) { contador++; // Este es el context Switcher por así decirlo if (pcbActual == null & listaPcb.Count > 0) { pid = pid % listaPcb.Count; pcbActual = listaPcb[pid]; pcbActual.activar(); } else if (listaPcb.Count == 0) { pcbActual = null; } else if (pcbActual.estaActivo()) { pcbActual.context = pcbActual.funcion_utilizar(pcbActual.context); //pcbActual.funcion(); pcbActual.quantumProgress++; pcbActual.apagar(); } else { pid++; pid = pid % listaPcb.Count; pcbActual = listaPcb[pid]; pcbActual.activar(); } // Impresión de la consola lock (consoleInfo) { Console.Clear(); for (int i = listaPcb.Count; i < 4; i++) { consoleInfo.outputBuffer[i] = "Proceso sin iniciar"; } consoleInfo.outputBuffer[4] = "Contador global." + contador; consoleInfo.outputBuffer[5] = "PID." + pid; foreach (var item in consoleInfo.outputBuffer) { if (consoleInfo.outputBuffer.IndexOf(item) < 4) { if (consoleInfo.outputBuffer.IndexOf(item) == pid) { Console.ForegroundColor = colores[consoleInfo.outputBuffer.IndexOf(item)]; } } Console.WriteLine(item); Console.ForegroundColor = ConsoleColor.Gray; } Console.WriteLine("--------------------------------------------------------------"); if (consoleInfo.commandReaty) { consoleInfo.commandReaty = false; consoleInfo.lastCommand = consoleInfo.sbRead.ToString(); consoleInfo.sbRead.Clear(); consoleInfo.lastResult.Clear(); String[] strlist = consoleInfo.lastCommand.Split(" ", 3, StringSplitOptions.RemoveEmptyEntries); switch (strlist[0].ToLower()) { case "quit": encendido = false; consoleInfo.lastResult.Append("¡Programa terminado exitosamente!"); break; case "add": AgregarProceso(strlist); break; case "kill": EliminarProcesos(strlist); break; case "ch": ModificarProcesos(strlist); break; case "list": ListarProcesos(); break; case "?": consoleInfo.lastResult.AppendLine("Comandos disponibles:"); consoleInfo.lastResult.AppendLine("add #function #quantum Agrega un nuevo proceso. Máximo 4."); consoleInfo.lastResult.AppendLine("ch #pid #quantum Cambia el quantum a un proceso."); consoleInfo.lastResult.AppendLine("list Lista los procesos actuales."); consoleInfo.lastResult.AppendLine("kill #pid Mata un proceso según su ID."); consoleInfo.lastResult.AppendLine("quit #pid Salir del programa."); break; default: consoleInfo.lastResult.Append("Comando inválido, use ? para ver la lista de comandos"); break; } } Console.WriteLine(consoleInfo.lastCommand); Console.WriteLine(consoleInfo.lastResult); Console.WriteLine(); Console.Write(">"); Console.WriteLine(consoleInfo.sbRead.ToString()); Console.WriteLine(); } Thread.Sleep(150); } }