//Procura um processo por índice public Processo BuscarProcesso(int indice) { if (!FilaVazia()) { mutex.WaitOne(); if (indice >= ContadorDeProcesso) //indice maior do que o limite { mutex.ReleaseMutex(); return(null); } ItemProcesso aux = Frente.Proximo; for (int contador = 0; contador < indice; contador++) //passa o ponteiro, até chegar no indice desejado { aux = aux.Proximo; } mutex.ReleaseMutex(); return(aux._Processo); } return(null); }
//Remove um processo, sendo sempre o primeiro da fila a ser removido public Processo DesenfileirarProcesso() { mutex.WaitOne(); if (!FilaVazia()) { ItemProcesso aux = Frente.Proximo; Frente.Proximo = aux.Proximo; aux.Proximo = null; if (Frente.Proximo == null) { Tras = Frente; } ContadorDeProcesso--; mutex.ReleaseMutex(); return(aux._Processo); } else { mutex.ReleaseMutex(); return(null); } }
//Construtor da fila public FilaDeProcessos() { ItemProcesso sentinela = new ItemProcesso(); Frente = sentinela; Tras = sentinela; ContadorDeProcesso = 0; }
//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(); }