//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); } }