// 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(); })); }
// 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); } }