private void calcularPromediosRR()
        {
            //Para recuperar los valores al final
            Proceso[] listRoundRobin = new Proceso[numProcesos];
            respaldarLista(ref listRoundRobin);
            Console.WriteLine(tiempoProcesos[0].tiempoProcesamiento);

            //matriz de sumas de espera y respuesta, indice 0 en las filas es para espera, 1 para respuesta y el 2 para el valor anteterior con el que se calculará la espera
            int[,] esperaRespuesta = new int[3, numProcesos];

            int iteraciones = 0;

            getNumeroDeVueltas(ref iteraciones);

            int totalEspera    = 0;
            int totalRespuesta = 0;
            int cmax           = 0;
            int indices        = numProcesos;

            for (int i = 0; i < iteraciones; i++)
            {
                for (int j = 0; j < numProcesos; j++)
                {
                    if (listRoundRobin[j].tiempoProcesamiento > this.Quantum)
                    {
                        //Cada que entre
                        esperaRespuesta[0, j] += cmax - esperaRespuesta[2, j];
                        cmax += this.Quantum;
                        esperaRespuesta[2, j] = cmax;

                        LabelsEspeciales labelRR = new LabelsEspeciales(listRoundRobin[j].numeroProceso, this.Quantum, cmax, j);
                        listRoundRobin[j].tiempoProcesamiento -= this.Quantum;
                        flPanelGanttRR.Controls.Add(labelRR);
                    }
                    else if (listRoundRobin[j].tiempoProcesamiento > 0)  //Igual o menor se deja en 0 su valor
                    {
                        esperaRespuesta[0, j] += cmax - esperaRespuesta[2, j];
                        cmax += listRoundRobin[j].tiempoProcesamiento;


                        //Llegados a este punto será la última instancia, cuando ya acabó el proceso, ya no se ejecutará otra vez
                        esperaRespuesta[1, j] = cmax;

                        LabelsEspeciales labelRR = new LabelsEspeciales(listRoundRobin[j].numeroProceso, listRoundRobin[j].tiempoProcesamiento, cmax, j);
                        listRoundRobin[j].tiempoProcesamiento = 0;
                        flPanelGanttRR.Controls.Add(labelRR);
                    }
                }
            }
            Console.WriteLine(tiempoProcesos[0].tiempoProcesamiento);
            flPanelGanttRR.WrapContents = false;

            calcularTotalEsperaRespuesta(ref totalEspera, ref totalRespuesta, esperaRespuesta);

            lblCmaxRR.Text      = "Cmax: " + cmax;
            lblEsperaRR.Text    = "Promedio espera: " + Math.Round(((double)totalEspera / numProcesos), 4);
            lblRespuestaRR.Text = "Promedio respuesta: " + Math.Round(((double)totalRespuesta / numProcesos), 4);
        }
        //Llena la tabla para FCFS
        private void btnGenerarProcesos_Click(object sender, EventArgs e)
        {
            //Si se presiona el botón con los mismos valores que ya se calcularon no se debe de hacer nada
            if (numProcesos != (int)udNumProcesos.Value || timeMax != (int)udNumTimeMax.Value)
            {
                flpTabla.SelectedIndex = 0;
                numProcesos            = (int)udNumProcesos.Value;
                timeMax = (int)udNumTimeMax.Value;

                //Se limpian todas las tablas cada vez que se generan nuevos valores
                flPanelTablaFCFS.Controls.Clear();
                flpTablaSJF.Controls.Clear();
                flpTablaLJF.Controls.Clear();
                flpTablaRR.Controls.Clear();

                Random aleatorio = new Random();
                lblProcesos.Text = "|   ";
                //Se limpia la lista que guarda todos los procesos anteriores
                tiempoProcesos.Clear();

                for (int i = 0; i < numProcesos; i++)
                {
                    int     num     = aleatorio.Next(1, timeMax);
                    Proceso proceso = new Proceso(i + 1, num);
                    tiempoProcesos.Add(proceso);
                    lblProcesos.Text += "P" + (i + 1) + " = " + num + "   |   ";

                    LabelsEspeciales labelProceso = new LabelsEspeciales(i + 1);
                    flPanelTablaFCFS.Controls.Add(labelProceso);

                    LabelsEspeciales labelTiempo = new LabelsEspeciales(num);
                    flPanelTablaFCFS.Controls.Add(labelTiempo);

                    if (i % 2 == 0)
                    {
                        labelProceso.BackColor = Color.FromArgb(96, 192, 205);
                        labelTiempo.BackColor  = Color.FromArgb(96, 192, 205);
                    }
                }
                //Se limpian todos los paneles de diagramas de Gantt
                flPanelGanttFCFS.Controls.Clear();
                flPanelGanttSJF.Controls.Clear();
                flPanelGanttLJF.Controls.Clear();
                flPanelGanttRR.Controls.Clear();

                calcularPromediosFCFS(0);

                panelActivo[0] = true;

                //ShortestJobFirst
                panelActivo[1] = false;
                //LargestJobFirst
                panelActivo[2] = false;
                //RoundRobin
                panelActivo[3] = false;
            }
        }
        //Llenas las tablas SJF, LJF, RR
        public void llenarTabla(ref FlowLayoutPanel contenedorTabla, List <Proceso> procesos)
        {
            for (int i = 0; i < numProcesos; i++)
            {
                LabelsEspeciales labelProceso = new LabelsEspeciales(procesos[i].numeroProceso);
                contenedorTabla.Controls.Add(labelProceso);

                LabelsEspeciales labelTiempo = new LabelsEspeciales(procesos[i].tiempoProcesamiento);
                contenedorTabla.Controls.Add(labelTiempo);

                if (i % 2 == 0)
                {
                    labelProceso.BackColor = Color.FromArgb(96, 192, 205);
                    labelTiempo.BackColor  = Color.FromArgb(96, 192, 205);
                }
            }
        }