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); } }
public void PreencherFilaDeProcessos(FilaDeProcessos [] f) { if (File.Exists(fileName)) //verifica se o arquivo existe { reader = new StreamReader(fileName); //instância o objeto while (!reader.EndOfStream) //enquanto o arquivo não tiver sido lido completamente { int prioridade = -1; Processo processo = MontaNovoProcesso(); //no método MontaNovoProcesso ocorre a leitura do arquivo e montagem do processo switch (processo.Prioridade) //switch para definir em qual fila de prioridade o processo deve ser inserido { case 1: prioridade = 0; break; case 2: prioridade = 1; break; case 3: prioridade = 2; break; case 4: prioridade = 3; break; case 5: prioridade = 4; break; } try { f[prioridade].EnfileirarProcesso(processo); } catch (IndexOutOfRangeException) { MessageBox.Show("Erro inesperado: Prioridade com valor incorreto."); } } reader.Close(); } }
//Enfileira um processo, colocando-o na ultima posição public void EnfileirarProcesso(Processo p) { mutex.WaitOne(); ItemProcesso novoProcesso = new ItemProcesso(p); if (!novoProcesso._Processo.TempoEmEspera.IsRunning) { novoProcesso._Processo.TempoEmEspera.Start(); } if (FilaVazia()) { Frente.Proximo = novoProcesso; } Tras.Proximo = novoProcesso; Tras = novoProcesso; ContadorDeProcesso++; mutex.ReleaseMutex(); }
public ItemProcesso(Processo p) { _Processo = p; }