/// <summary> /// Simula a execução do escalonador /// </summary> public void Run() { CPU cpu = new CPU(); int pos = 0; while (!TodosVazia() && pos < TodasFilasProcessos.Length) // Enquanto todas as filas de processos não estiverem vazias { while (!TodasFilasProcessos[pos].Vazio()) // Enquanto uma fila especifica não estiver vazia { //Retirar da fila e da listView Monitor.Enter(this); Processo processo = (Processo)(TodasFilasProcessos[pos].Retirar()); if (processo == null) //alguma thread ficou presa dentro do while RESOLVER ISSO { break; } Controle.RetirarListViewPrioridades(processo); if (Thread.CurrentThread.Name == Controle.thread_cpu0.Name) { Controle.TrocarLabel("Rodando: " + processo.Nome, 0); } else if (Thread.CurrentThread.Name == Controle.thread_cpu1.Name) { Controle.TrocarLabel("Rodando: " + processo.Nome, 1); } Monitor.Exit(this); int reposta = cpu.Run(processo); Monitor.Enter(this); if (reposta < 0) { //não terminou AdicionarProcesso(processo); Controle.InserirListViewPrioridades(processo); } else if (reposta == 0) { //suspendeu AdicionarProcesso(processo); Controle.InserirListViewPrioridades(processo); } else { //terminou Controle.InserirListViewPronto(processo); } Monitor.Exit(this); } pos++; } if (Thread.CurrentThread.Name == Controle.thread_cpu0.Name) { Controle.TrocarLabel("Fim", 0); } else if (Thread.CurrentThread.Name == Controle.thread_cpu1.Name) { Controle.TrocarLabel("Fim", 0); } System.Windows.Threading.Dispatcher.Run(); }
public MainWindow() { InitializeComponent(); Controle.InicializarThreadAdicional(); }