Пример #1
0
        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");
            }
        }
Пример #2
0
        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);
            }
        }