예제 #1
0
        // Refresh interface (atualizar os valores)
        private void AtualizaInterface()
        {
            // Enquanto houver processos a serem executados
            while (!ProcessoGerenciador.FilaProcesssoVazia(processoFilas))
            {
                try
                {
                    Dispatcher.Invoke(
                        new Action(() =>
                    {
                        numThreadExibe = ComboBoxThreadExibicao.SelectedIndex;
                    }));

                    // Tabela é atualizada
                    AtualizarValores(numThreadExibe);

                    // Thread dorme por tempo determinado pelo usuario
                    Thread.Sleep(tempoRefreshInterface);
                }

                // Exceção disparada quando tentam finalizar o programa antes das tarefas serem concluidas
                catch (TaskCanceledException)
                {
                    // finaliza a thread
                    return;
                }
            }

            Dispatcher.Invoke(
                new Action(() =>
            {
                // Limpa a tela para remover os processos que restaram no DataGrid
                DataGridGerenciador.Items.Clear();
                MessageBox.Show("Todos os processos foram concluídos ", TotalProcessosConcluidos().ToString(), MessageBoxButton.OK, MessageBoxImage.Information);

                // libera e limpa todos os controles
                AtualizarControles(true);

                LabelNomeProcesso.Content = "";
                LabelPID.Content          = "";
                LabelPrioridade.Content   = "";
                LabelTempoExec.Content    = "";

                InterromperThreads();
            }));
        }
예제 #2
0
        // Evento de click do botão de iniciar a simulação
        private void BtnIniciaSimulacao_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // captura os valores dados pelo usuario
                int q = int.Parse(TxtQuantum.Text);
                // número de threads
                int threads = (Convert.ToInt32(ComboBoxNumeroThreads.SelectedIndex + 1));
                // Tempo de atualização da interface
                tempoRefreshInterface = int.Parse(TxtTempoInterface.Text);
                //tempo de verificação de execução
                int tempoVerificacao = int.Parse(TxtTempoVerif.Text);
                //tempo máximo de espera antes de subir a prioridade
                int tempoEspera = int.Parse(TxtTempoEspera.Text);
                totalProcesso = 0;
                //Tratamento de erros
                if (q <= 0)
                {
                    MessageBox.Show("Quantum inválido. O tempo deve ser superior a 0.");
                }

                else if (tempoRefreshInterface <= 0)
                {
                    MessageBox.Show("Tempo de atualização de interface inválido. O tempo deve ser superior a 0.");
                }

                else if (tempoVerificacao <= 0)
                {
                    MessageBox.Show("Tempo de verificação de prioridades inválido. O tempo deve ser superior a 0.");
                }

                else if (threads <= 0)
                {
                    MessageBox.Show("Indique um número de threads.");
                }


                // Bloco executado quando não há erros
                // Sem erros de números inferiores a 0
                else
                {
                    // Declarando tamanho dos vetores de threads e gerenciadores de processos
                    gerenciadorProcessos = new ProcessoGerenciador[threads];
                    ThreadsExecucao      = new Thread[threads];

                    // Preenche as filas com os processos necessários
                    gerador.PreencherFilaDeProcessos(processoFilas);

                    // Loop para descobrir quantos processos necessitam de serem executados
                    foreach (ProcessoFila fila in processoFilas)
                    {
                        totalProcesso += fila.ContadorProcesso;
                    }

                    // Instanciando todos os gerenciadores de processo
                    for (int ax = 0; ax < threads; ax++)
                    {
                        gerenciadorProcessos[ax] = new ProcessoGerenciador(q, tempoVerificacao);
                    }

                    int a = 0;

                    // Inicia as threads de execução
                    foreach (ProcessoGerenciador g in gerenciadorProcessos)
                    {
                        ThreadsExecucao[a] = new Thread(() => g.ExecutarProcesso(processoFilas));
                        ThreadsExecucao[a].Start();
                        a++;
                    }

                    ContPrioridadeEspera = new Thread(() => ProcessoGerenciador.ControlePrioridadeEspera(processoFilas, tempoEspera));
                    ContPrioridadeEspera.Start();

                    ThreadInterface = new Thread(AtualizaInterface);

                    // Adiciona items no ComboBox de Threads, de acordo com o numero de Threads que o usuario solicitar
                    for (int ab = 0; ab < threads; ab++)
                    {
                        ComboBoxThreadExibicao.Items.Add(ab + 1);
                    }

                    ComboBoxThreadExibicao.SelectedIndex = 0;
                    ThreadInterface.Start();
                    AtualizarControles(false);
                }
            }

            catch (FormatException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }