// Método que instancia todas as filas de todas as prioridades private void InstanciarFilas() { for (int i = 0; i < processoFilas.Length; i++) { processoFilas[i] = new ProcessoFila(); } }
// @TODO public static void ControlePrioridadeEspera(ProcessoFila[] filaProcessos, int TempoMaximoDeEspera) { while (true) { // Thread dorme para não verificar a todo instante Thread.Sleep(TempoMaximoDeEspera); // Fila auxiliar ProcessoFila[] FilasAux = new ProcessoFila[32]; // Instânciando as filas for (int p = 0; p < FilasAux.Length; p++) { FilasAux[p] = new ProcessoFila(); } Monitor.Enter(filaProcessos); // Percorre a fila prioridade for (int x = 0; x < filaProcessos.Length - 1; x++) { // Captura o número de processos na fila int nProcs = filaProcessos[x].ContadorProcesso; // Define a prioridade int prioridadeFila = x; for (int u = 0; u < nProcs; u++) { // Retira o processo da fila Processo processoEmAnalise = filaProcessos[prioridadeFila].DesenfileirarProcesso(); // Verifica necessidade de subir prioridade if (processoEmAnalise.TempoEspera.ElapsedMilliseconds > TempoMaximoDeEspera) { // Eleva a prioridade do processo e altera o valor da variavel prioridade prioridadeFila = processoEmAnalise.ElevarPrioridade() - 1; // Coloca o processo na fila auxiliar FilasAux[prioridadeFila - 1].EnfileirarProcesso(processoEmAnalise); } else { // Coloca o processo de volta na mesma fila filaProcessos[prioridadeFila].EnfileirarProcesso(processoEmAnalise); } // Altera o valor da prioridade para evitar bugs prioridadeFila = x; } } // Percorre as filas para adicionar os processos em suas devidas filas for (int i = 1; i < filaProcessos.Length; i++) { while (!FilasAux[i - 1].FilaVazia()) { filaProcessos[i].EnfileirarProcesso(FilasAux[i - 1].DesenfileirarProcesso()); } } Monitor.Exit(filaProcessos); } }