コード例 #1
0
 //Método que instancia todas as filas de todas as prioridades
 private void InstanciarFilas()
 {
     for (int i = 0; i < FilaProcessos.Length; i++)
     {
         FilaProcessos[i] = new FilaDeProcessos();
     }
 }
        public static void ControlePrioridadeEspera(FilaDeProcessos[] filaProcessos, int TempoMaximoDeEspera)
        {
            while (true)
            {
                Thread.Sleep(TempoMaximoDeEspera);                    //Thread dorme para não verificar a todo instante

                FilaDeProcessos [] FilasAux = new FilaDeProcessos[4]; //fila auxiliar

                for (int p = 0; p < FilasAux.Length; p++)             //instânciando as filas
                {
                    FilasAux[p] = new FilaDeProcessos();
                }

                Monitor.Enter(filaProcessos);

                for (int x = 0; x < filaProcessos.Length - 1; x++)            //percorre a fila prioridade 1 até a 4
                {
                    int nProcs         = filaProcessos[x].ContadorDeProcesso; //captura o número de processos na fila
                    int prioridadeFila = x;                                   //define a prioridade

                    for (int u = 0; u < nProcs; u++)
                    {
                        Processo processoEmAnalise = filaProcessos[prioridadeFila].DesenfileirarProcesso(); //retira o processo da fila

                        if (processoEmAnalise.TempoEmEspera.ElapsedMilliseconds > TempoMaximoDeEspera)      //verifica necessidade de subir prioridade
                        {
                            prioridadeFila = processoEmAnalise.ElevarPrioridade() - 1;                      //eleva a prioridade do processo e altera o valor da variavel prioridade
                            FilasAux[prioridadeFila - 1].EnfileirarProcesso(processoEmAnalise);             //coloca o processo na fila auxiliar
                        }

                        else
                        {
                            filaProcessos[prioridadeFila].EnfileirarProcesso(processoEmAnalise); //coloca o processo de volta na mesma fila
                        }

                        prioridadeFila = x; //altera o valor da prioridade para evitar bugs
                    }
                }

                for (int i = 1; i < filaProcessos.Length; i++) //percorre as filas para adicionar os processos em suas devidas filas
                {
                    while (!FilasAux[i - 1].FilaVazia())
                    {
                        filaProcessos[i].EnfileirarProcesso(FilasAux[i - 1].DesenfileirarProcesso());
                    }
                }

                Monitor.Exit(filaProcessos);
            }
        }