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();
            }
        }
Пример #3
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();
        }
 public ItemProcesso(Processo p)
 {
     _Processo = p;
 }