1
I haven’t dealt with C#for a while, I’m making a simple code, to perform simulations on demand and process data, applying FIFO. My problem is regarding the variable attributes of the Fila class, I performed the program debug and noticed that when running the generating methodMetricas() the attributes are empty, with the . Count = 0. Can anyone help me ? Below my code.
class Fila
{
// Lista contendo tempos de espera na fila
public List<int> listaTempoEspera { get; set; }
// Lista tempo de processamento
public List<int> listaTempoProcessamento { get; set; }
// Lista demanda, intervalo entre chegada de novos itens a serem processados
public List<int> listaIntervaloDemanda { get; set; }
// Uma listagem com o tempo que o sistema ficou ocioso.
public List<int> listaTempoOcioso { get; set; }
// Métrica
public Metrica metrica { get; set; }
// Construtores
public Fila(List<int>listaProcessamento, List<int> listaDemanda)
{
this.listaIntervaloDemanda = listaDemanda;
this.listaTempoProcessamento = listaProcessamento;
this.listaTempoEspera = new List<int>();
this.listaTempoOcioso = new List<int>();
this.metrica = new Metrica();
}
public Fila()
{
this.listaIntervaloDemanda = new List<int>();
this.listaTempoProcessamento = new List<int>();
this.listaTempoEspera = new List<int>();
this.listaTempoOcioso = new List<int>();
this.metrica = new Metrica();
}
// Executar Simulação
public void ExecutarSimulacao(List<int> varExTempoProcessamento, List<int> varExTempoDemanda)
{
// Cria variáveis para execução dos métodos
// Inicia var da fila
List<int> filaExecucao = new List<int>();
// Tempo na fila
List<int> tempoNaFila = new List<int>();
// Variavel de Tempo
int tempoTotal = 0;
int tempoChegadaDemanda = 0;
// Variavel sinalizacao sistemaOcupado
bool sistemaOcupado = false;
// Var processamento
int processamentoAtual = 0;
// var TempoOcioso
int tempoOcioso = 0;
while (varExTempoProcessamento.Count > 0 || varExTempoDemanda.Count > 0 || filaExecucao.Count > 0)
{
// Incrementa o tempo a cada iteração
tempoTotal++;
tempoChegadaDemanda++;
// Faz o teste nova Demanda
bool novaDemanda = tempoChegadaDemanda == varExTempoDemanda[0];
if (novaDemanda)
{
// Remove da Lista
varExTempoDemanda.RemoveAt(0);
// Zera o tempoChegadaDemanda
tempoChegadaDemanda = 0;
// Verifica se o sistema esta executando algum pedido
if (sistemaOcupado == false)
{
// Atribue nova chegada diretamente ao processamento
processamentoAtual = varExTempoProcessamento[0];
// Deleta da fila
varExTempoProcessamento.RemoveAt(0);
// Muda o status do sistema par ocupado
sistemaOcupado = true;
//Adiciona 0(Zero) a lista tempo de espera
listaTempoEspera.Add(0);
}
else
{
// Caso o sistema estivesse ocioso, envia o dado para a lista.
if (tempoOcioso > 0)
{
listaTempoOcioso.Add(tempoOcioso);
tempoOcioso = 0;
}
// Adiciona a fila
filaExecucao.Add(varExTempoProcessamento[0]);
// Remove da lista de processamento
varExTempoProcessamento.RemoveAt(0);
// Cria nova posição na fila
tempoNaFila.Add(0);
}
} // Fim If Nova Demanda
// IF Sistema em Processamento
if (sistemaOcupado && processamentoAtual > 0)
{
processamentoAtual--;
}
else
{
// Verifica se há alguem na fila
if (filaExecucao.Count > 0)
{
// Atribue novo processamento diretamente da fila
processamentoAtual = filaExecucao[0];
// Deleta da fila
filaExecucao.RemoveAt(0);
// Adiciona o tempo de fila a lista TempoEspera
listaTempoEspera.Add(tempoNaFila[0]);
// Remove da Lista tempo da fila elemento já computado
tempoNaFila.RemoveAt(0);
// Não há mudança no status do sistema
// Adiciona tempo Não ocioso
listaTempoOcioso.Add(0);
}
else
{
sistemaOcupado = false;
}
} // Fim do IF Sistema em Processamento
// Tempo de fila
bool existeFila = filaExecucao.Count > 0;
if (existeFila)
{
for (int i = 0; i < filaExecucao.Count; i++)
{
tempoNaFila[i]++;
}
}
else
{
tempoOcioso++;
} // Fim tempo de fila
}
metrica.tempoTotal = tempoTotal;
} // Fim método ExecutarSimulacao
// Gerar Métricas
public Metrica GerarMetricas()
{
//Gera as metricas do tempo de espera
GerarMetricasTempoEspera();
//Gera as metricas do tempo de Intervalo entre demandas
GerarMetricasTempoDemanda();
//Gera as metricas do tempo Ocioso
GerarMetricasTempoOcioso();
//Gera as metricas do tempo de processamento
GerarMetricasTempoProcessamento();
return this.metrica;
} // Fim método GerarMetricas
public void GerarMetricasTempoEspera()
{
// Calcula a Média
int media = 0;
for (int i = 0; i < listaTempoEspera.Count; i++)
{
media += listaTempoEspera[i];
}
if (listaTempoEspera.Count != 0)
{
metrica.mediaEsperaFila = media / listaTempoEspera.Count;
}
// Calcula a Moda
var moda = listaTempoEspera.GroupBy(n => n).
OrderByDescending(g => g.Count()).
Select(g => g.Key).FirstOrDefault();
metrica.modaEsperaFila = moda;
}
public void GerarMetricasTempoProcessamento()
{
// Calcula a Média
int media = 0;
for (int i = 0; i < listaTempoProcessamento.Count; i++)
{
media += listaTempoProcessamento[i];
}
if (listaTempoProcessamento.Count !=0)
{
metrica.mediaProcessamento = media / listaTempoProcessamento.Count;
}
// Calcula a Moda
var moda = listaTempoProcessamento.GroupBy(n => n).
OrderByDescending(g => g.Count()).
Select(g => g.Key).FirstOrDefault();
metrica.modaProcessamento = moda;
}
public void GerarMetricasTempoDemanda()
{
// Calcula a Média
int media = 0;
for (int i = 0; i < listaIntervaloDemanda.Count; i++)
{
media += listaIntervaloDemanda[i];
}
if (listaIntervaloDemanda.Count !=0)
{
metrica.mediaDemanda = media / listaIntervaloDemanda.Count;
}
// Calcula a Moda
var moda = listaIntervaloDemanda.GroupBy(n => n).
OrderByDescending(g => g.Count()).
Select(g => g.Key).FirstOrDefault();
metrica.modaDemanda = moda;
}
public void GerarMetricasTempoOcioso()
{
// Calcula a Média
int media = 0;
for (int i = 0; i < listaTempoOcioso.Count; i++)
{
media += listaTempoOcioso[i];
}
if (listaTempoOcioso.Count != 0)
{
metrica.mediaOciosidade = media / listaTempoOcioso.Count;
}
// Calcula a Moda
var moda = listaTempoOcioso.GroupBy(n => n).
OrderByDescending(g => g.Count()).
Select(g => g.Key).FirstOrDefault();
metrica.modaOciosidade = moda;
}
// ---------------------------------------------------
public void ExecutarSimulacaoTarefa3(int numeroServidores, List<int> varExTempoProcessamento, List<int> varExTempoDemanda)
{
// Cria variáveis para execução dos métodos
// Inicia var da fila
List<int> filaExecucao = new List<int>();
// Tempo na fila
List<int> tempoNaFila = new List<int>();
// Variavel de Tempo
int tempoTotal = 0;
int tempoChegadaDemanda = 0;
// var TempoOcioso
int tempoOcioso = 0;
// Var Servidores
List<int> servidores = new List<int>();
List<bool> servidorOcupado = new List<bool>();
bool novaDemanda = false;
for (int i = 0; i < numeroServidores; i++)
{
servidores.Add(0);
servidorOcupado.Add(false);
}
while (varExTempoProcessamento.Count > 0 || varExTempoDemanda.Count > 0 || filaExecucao.Count > 0)
{
// Incrementa o tempo a cada iteração
tempoTotal++;
tempoChegadaDemanda++;
// Faz o teste nova Demanda
if (varExTempoDemanda.Count> 0)
{
novaDemanda = tempoChegadaDemanda == varExTempoDemanda[0];
}
else
{
novaDemanda = false;
}
//----
if (novaDemanda)
{
// Remove da Lista
varExTempoDemanda.RemoveAt(0);
// Zera o tempoChegadaDemanda
tempoChegadaDemanda = 0;
// Verifica se o sistema esta executando algum pedido
for (int i = 0; i < numeroServidores; i++)
{
if (servidorOcupado[i] == false)
{
// Atribue nova chegada diretamente ao processamento
servidores[i] = varExTempoProcessamento[0];
// Deleta da fila
varExTempoProcessamento.RemoveAt(0);
// Muda o status do sistema par ocupado
servidorOcupado[i] = true;
//Adiciona 0(Zero) a lista tempo de espera
listaTempoEspera.Add(0);
// Parar
break;
}
else if(i == numeroServidores-1)
{
// Caso o sistema estiver ocioso, envia o dado para a lista.
if (tempoOcioso > 0)
{
listaTempoOcioso.Add(tempoOcioso);
tempoOcioso = 0;
}
// Adiciona a fila
filaExecucao.Add(varExTempoProcessamento[0]);
// Remove da lista de processamento
varExTempoProcessamento.RemoveAt(0);
// Cria nova posição na fila
tempoNaFila.Add(0);
}
}
} // Fim If Nova Demanda
//// IF Sistema em Processamento
for (int i = 0; i < numeroServidores; i++)
{
// -----------------
if (servidorOcupado[i] && servidores[i] > 0)
{
servidores[i]--;
}
else
{
// Verifica se há alguem na fila
if (filaExecucao.Count > 0)
{
// Atribue novo processamento diretamente da fila
servidores[i] = filaExecucao[0];
// Deleta da fila
filaExecucao.RemoveAt(0);
// Adiciona o tempo de fila a lista TempoEspera
listaTempoEspera.Add(tempoNaFila[0]);
// Remove da Lista tempo da fila elemento já computado
tempoNaFila.RemoveAt(0);
// Não há mudança no status do sistema
// Adiciona tempo Não ocioso
listaTempoOcioso.Add(0);
}
else
{
servidorOcupado[i] = false;
}
}
} // Fim do IF Sistema em Processamento
// Tempo de fila
bool existeFila = filaExecucao.Count > 0;
if (existeFila)
{
for (int i = 0; i < filaExecucao.Count; i++)
{
tempoNaFila[i]++;
}
}
else
{
tempoOcioso++;
} // Fim tempo de fila
}
metrica.tempoTotal = tempoTotal;
} // Fim método ExecutarSimulacao
}// Fim Namespace Classe
}
And what do you expect it to be? Does it ever have the value you expect? Have you run the simulation yet? There it removes elements. Alias it seems to me that the class depends on a call order of the methods to work. This is not usually a good idea.
– Maniero