Simulador de Procesos de Bloqueo [C Sharp]

Simulador de Procesos de bloqueo, consiste en asignar una lista de tareas cada una con un tiempo que es el tiempo que durará en ejecutar, los procesos pueden bloquearse y una vez que todo el resto de procesos termine esta tarea bloqueada se ejecutará.


Publicado: Editado: Estado:

El Sistema Operativo permite simplificar la gestión de recursos. La administración eficiente de los recursos implica una cuidadosa planificación del uso de cada uno. El procesador o CPU es un recurso clave, su correcta planificación constituye uno de los puntos centrales en el dise˜no de un buen Sistema Operativo.

Este ejemplo que les compartos trabaja con una lista de tareas para su proceso que son cargadas en Listo según cada tarea tiene un tiempo definido, es el tiempo que va a estar en Ejecución, si deseas bloquear una tarea (proceso) da clic en Ejecución esta tarea se hirá a Bloqueado y que estará ahí hasta que se termine el resto de las tareas se pobra ejecutar.

Una parte del código abajo les dejo el enlace de descarga.


//Librerias utilizar por C# agregadas automaticamente 
//aunque tambien se pueden agregar otras
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Simulador
{
    public partial class frmSimulador : Form
    {
        //Variables globales del tiempo de cada proceso        
        int CPUTime1;
        int CPUTime2;
        int CPUTime3;
        int CPUTime4;
        //Variable tiempo actual
        int TimeActual;

        public frmSimulador()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Se cargan los datos en tabla
            Tabla.Rows.Add("1", "Chrome", "3", "4", "Listo");
            Tabla.Rows.Add("2", "Firefox", "3", "6", "Listo");
            Tabla.Rows.Add("3", "IExplorer", "3", "4", "Listo");
            Tabla.Rows.Add("4", "office", "3", "4", "Listo");

            //Deshabilitamos el boton cargar procesos
            button1.Enabled = false;
            button2.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Deshabilitar boton iniciar simulacion
            button2.Enabled = false;
            //Limpia los botones (Listo, ejecutar, bloqueado, terminado)
            Listo.Text = "";
            Ejecución.Text = "";
            button6.Text = "";
            button5.Text = "";

            //Cargamos los procesos a ejecutar (2, 3, 4)
            Listo.Text = Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString(); 
            //Pintamos el primer proceso en ejecucion
            Ejecución.Text = Tabla.Rows[0].Cells[0].Value.ToString();
            //Habilitamos el Timer1 del proceso uno
            timer1.Enabled = true;
            
            //Declaramos en cero para iniciar
            TimeActual = 0;
            //Asignamos el tiempo a cada uno de los procesos
            CPUTime1 = Convert.ToInt32(Tabla.Rows[0].Cells[3].Value.ToString());
            CPUTime2 = Convert.ToInt32(Tabla.Rows[1].Cells[3].Value.ToString());
            CPUTime3 = Convert.ToInt32(Tabla.Rows[2].Cells[3].Value.ToString());
            CPUTime4 = Convert.ToInt32(Tabla.Rows[3].Cells[3].Value.ToString());
            //Iniciar el Timer1 del proceso uno
            timer1.Start();
        }

        //Timer1 Tick funcion para que se ejecute el evento segundos
        private void timer1_Tick(object sender, EventArgs e)
        {
            //Variale es incrementada
            TimeActual++;
            //Marcamos el tiempo en pantalla 
            tiempo.Text = TimeActual.ToString();

            //Sentencia si el tiempo actual es igual al tiempo asignado al proceso
            if (TimeActual == CPUTime1)
            {
                //Declaramos en cero
                TimeActual = 0;
                //Pintamos el primer proceso como terminado 
                button6.Text = Tabla.Rows[0].Cells[0].Value.ToString();
                //Limpiamos el boton ejecucion
                Ejecución.Text = "";
                //Y pintamos el segundo proceso en ejecucion
                Ejecución.Text = Tabla.Rows[1].Cells[0].Value.ToString();
                //Pintamos en listo los procesos 3 y 4 
                Listo.Text = Tabla.Rows[2].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString();

                //Sentencia si el boton bloqueado es igual al proceso uno
                //Si el usuario ha bloqueado el proceso uno
                if (button5.Text == "1")
                {
                    //Paramos el timer1 del proceso uno
                    timer1.Stop();
                    //Deshabilitamos el timer1 del proceso uno
                    timer1.Enabled = false;
                    //Limpiar los botones
                    Listo.Text = "";
                    Ejecución.Text = "";
                    button5.Text = "";
                    button6.Text = "1, 2, 3, 4";
                    tiempo.Text = "0";
                }
                //Si no dio clic en bloquear proceso uno
                else
                {
                    //Deshabilito el timer1 del proceso uno
                    timer1.Enabled = false;
                    //Detenemos el timer1
                    timer1.Stop();
                    //Habilitamos el timer2
                    timer2.Enabled = true;
                    //Iniciamos el timer2
                    timer2.Start();
                }               
            }

        }

        private void timer2_Tick_1(object sender, EventArgs e)
        {
            TimeActual++;
            tiempo.Text = TimeActual.ToString();

            if (TimeActual == CPUTime2)
            {
                TimeActual = 0;
                //Sentencia si el proceso bloqueado es uno
                if (button5.Text == "1")
                {
                    //Pintamos el proceso dos en terminado (2)
                    button6.Text = Tabla.Rows[1].Cells[0].Value.ToString();
                    Listo.Text = "1, 4";
                    Ejecución.Text = Tabla.Rows[2].Cells[0].Value.ToString();
                }
                else
                {
                    //Pintamos el proceso (1, 2)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[1].Cells[0].Value.ToString();
                    
                    //Limpiamos lo que esta en ejecución
                    Ejecución.Text = "";
                    //Pintamos el tercer proceso
                    Ejecución.Text = Tabla.Rows[2].Cells[0].Value.ToString();
                    //Pintamos en listo el cuarto proceso
                    Listo.Text = Tabla.Rows[3].Cells[0].Value.ToString();
                }
                


                if (button5.Text == "2")
                {
                    timer2.Stop();
                    timer2.Enabled = false;

                    Listo.Text = "";
                    Ejecución.Text = "";
                    button5.Text = "";
                    button6.Text = "1, 2, 3, 4";
                    tiempo.Text = "0";
                }
                else
                {
                    timer2.Stop();
                    timer2.Enabled = false;
                    timer3.Enabled = true;
                    timer3.Start(); 
                }
            }
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            TimeActual++;
            tiempo.Text = TimeActual.ToString();

            if (TimeActual == CPUTime3)
            {
                TimeActual = 0;

                if (button5.Text == "1")
                {
                    //(2, 3)
                    button6.Text = Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString();
                    Listo.Text = "1";
                    Ejecución.Text = Tabla.Rows[3].Cells[0].Value.ToString();
                }
                else if(button5.Text == "2"){
                    //(1, 3)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString();
                    Listo.Text = "2";
                    Ejecución.Text = Tabla.Rows[3].Cells[0].Value.ToString();
                }
                else
                {
                    //(1, 2, 3)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString();
                    Ejecución.Text = "";
                    //Pintamos en ejecucion el proceso cuatro
                    Ejecución.Text = Tabla.Rows[3].Cells[0].Value.ToString();
                    Listo.Text = "";
                }
                


                if (button5.Text == "3")
                {
                    timer3.Stop();
                    timer3.Enabled = false;

                    Listo.Text = "";
                    Ejecución.Text = "";
                    button5.Text = "";
                    button6.Text = "1, 2, 3, 4";
                    tiempo.Text = "0";
                }
                else
                {
                    timer3.Stop();
                    timer3.Enabled = false;
                    timer4.Enabled = true;
                    timer4.Start();
                }
            }
        }

        private void timer4_Tick(object sender, EventArgs e)
        {
            TimeActual++;
            tiempo.Text = TimeActual.ToString();

            if (TimeActual == CPUTime4)
            {
                TimeActual = 0;
                if (button5.Text == "1")
                {
                    //(2, 3, 4)
                    button6.Text = Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString();
                }
                else if (button5.Text == "2")
                {
                    //(1, 3, 4)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString();
                    Listo.Text = "2";
                    Ejecución.Text = "2";
                }
                else if (button5.Text == "3")
                {
                    //(1, 2, 4)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString();
                    Listo.Text = "";
                    Ejecución.Text = "3";
                }
                else
                {
                    //(1, 2, 3, 4)
                    button6.Text = Tabla.Rows[0].Cells[0].Value.ToString() + ", " + Tabla.Rows[1].Cells[0].Value.ToString() + ", " + Tabla.Rows[2].Cells[0].Value.ToString() + ", " + Tabla.Rows[3].Cells[0].Value.ToString();
                    Ejecución.Text = "";
                }
                
               

                if (button5.Text == "1")
                {
                    Listo.Text = "r";
                }
                else
                {
                    Listo.Text = "";
                }
                tiempo.Text = "0";
                
                //Iniciamos los procesos bloqueados al final del proceso cuatro
                //Proceso Uno
                if(button5.Text == "1"){
                    Listo.Text = "1";
                    //Habilita timer1     
                    timer1.Enabled = true;             
                    //Inicia timer1
                    timer1.Start();
                    Ejecución.Text = "1";
                    Listo.Text = "";
                    button5.Visible = false;
                    button3.Visible = true;
                  
                }

                else if (button5.Text == "2")
                {
                    timer2.Enabled = true;
                    timer2.Start();
                    button5.Visible = false;
                    button3.Visible = true;
                }

                else if (button5.Text == "3")
                {
                    timer3.Enabled = true;
                    timer3.Start();
                    button5.Visible = false;
                    button3.Visible = true;
                }

                //detenemos el timer4 del proceso cuatro
                timer4.Stop();
                //deshabilitamos el timer4
                timer4.Enabled = false;                
            }
        }

        //Evento que nos permite bloquear los procesos con un click
        private void Ejecución_Click(object sender, EventArgs e)
        {
            //Detiene el proceso Uno e Inicia el proceso Dos
            if(Ejecución.Text == "1"){
                timer1.Stop();
                timer1.Enabled = false;

                //Pinta en bloqueo el proceso uno
                button5.Text = "1"; 
                Ejecución.Text = "";
                //Pinta el bloqueo a seguir el proceso dos
                Ejecución.Text = Tabla.Rows[1].Cells[0].Value.ToString();
                Listo.Text = "1, 3, 4";

                timer2.Enabled = true;
                timer2.Start();
            }
            //Detiene el proceso dos e inicia el proceso tres
            else if (Ejecución.Text == "2")
            {
                timer2.Stop();
                timer2.Enabled = false;

                button5.Text = "2";
                Ejecución.Text = "";
                Ejecución.Text = Tabla.Rows[2].Cells[0].Value.ToString();
                Listo.Text = "2, 4";

                timer3.Enabled = true;
                timer3.Start();
            }
            //Detiene el proceso tres e inicia el proceso cuatro
            else if (Ejecución.Text == "3")
            {
                timer3.Stop();
                timer3.Enabled = false;

                button5.Text = "3";
                Ejecución.Text = "";
                Ejecución.Text = Tabla.Rows[3].Cells[0].Value.ToString();
                Listo.Text = "3";

                timer4.Enabled = true;
                timer4.Start();
            }
            //Detener el proceso cuatro
            else if (Ejecución.Text == "4")
            {
                timer4.Stop();
                timer4.Enabled = false;

                button5.Text = "4";
                Ejecución.Text = "";
                //El boton iniciar simulacion es habilitado
                button2.Enabled = true;
                //El tiempo marcado en ejecucion se pinta en cero
                tiempo.Text = "0";
            }

        }

        //El objetivo de este boton es detener el proceso de simulacion e iniciar uno nuevo
        private void btnDetener_Click(object sender, EventArgs e)
        {
            //Detenemos los timer de los cuatro procesos
            //aunque no se hayan inicializados
            timer1.Stop();
            timer2.Stop();
            timer3.Stop();
            timer4.Stop();

            //Limpian todos los botones
            Listo.Text = "";
            Ejecución.Text = "";
            button5.Text = "";
            button6.Text = "";
            button2.Enabled = true;
            button5.Visible = true;
        }

        private void frmSimulador_Load(object sender, EventArgs e)
        {
            button3.Visible = false;
            button2.Enabled = false;
            
        }
    }
}

El diseño ejemplificado en Visual C# para descargar de clic acá.

Bibliografía
  • Por cuenta propia
Dar puntos de agradecimiento
Reportar esta publicación

Déjanos tu comentario

Comentarios

mariogarcia

(Administrador)

Intereses

música, diseño, programación, electrónica, historia, geografía

Puntos: 146 Votos: 113