• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

migueldesousa

C#: Quick Tip: tempo restante

11 mensagens neste tópico

no outro dia (sabado penso eu) um rapaz perguntou como se podia ver uma estimativa de quanto tempo restava até ao final de um ciclo, eu acho que assim dá :P

                   double totalMS = 0;
            double media = 0;
            DateTime timeNow = DateTime.Now;
            for (int x = 1; x < 101; x++)
            {
                this.Text = x.ToString();

                Random rnd = new Random(DateTime.Now.Second);
                Thread.Sleep(rnd.Next(100, 2000));
                DateTime tempTime = DateTime.Now;
                TimeSpan ts = tempTime - timeNow;

                timeNow = DateTime.Now;
                totalMS += ts.Seconds;
                media = totalMS / x;

                double restante = (media * (100 - x));
            }

se alguem nao perceber :P faça favor :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas..

Para que foi o Thread.Sleep ? Para conseguires ter tempo suficiente para a subtracção dar valores visto que só vai até aos milisegundos ? Ou para simular trabalho ?

É que penso que a chamada a esse método pode dar problemas.

Visto que o que acontece na chamada a esse método é a thread entrar em modo suspended por determinado timeout, ou seja, perde o processador e o processador vai correr outras waiting to execute threads (se existirem). Findo esse timeout a thread irá ser colocada na ready queue pelo que não há garantia que entre imediatamente em execução.

Penso que é aqui que pode falhar, pois nada garante que não existe naquele momento outras coisas para o processador fazer. Outro pormenor é que 100 iterações me parece pouco.

Corrijam-me se estiver errado, obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"ambos os dois" :P as 100 iterações e o thread sleep é em termos de exemplo :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se o "trabalho" em cada iteração do for for de curta duração não vais conseguir ler valores correctos devido a baixa precisão do DateTime.Now, e também não vejo a vantagem de estares a ler constantemente valores por cada iteração.

Porque não fazer uma leitura no inicio e outra no fim de todas as iterações e então só aí calcular a média ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a ideia é ver uma estimativa do tempo restante. claro que se for iteraçoes rapidas nao vale apena tentar saber o tempo :P a n ser que sejam milhoes de iterações

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podias era fazer da seguinte forma:

            DateTime timeNow = DateTime.Now;
            for (int x = 1; x < 101; x++) {
                this.Text = x.ToString();

                Random rnd = new Random(DateTime.Now.Second);
                Thread.Sleep(rnd.Next(100, 2000));
                DateTime tempTime = DateTime.Now;
                TimeSpan ts = tempTime - timeNow;

                double media = ts.Seconds / x;

                double restante = (media * (100 - x));
            }

Não é necessário usares um acumulador para os segundos. O TimeSpan já faz isso por ti. E assim evitas o problema de precisão do DateTime no caso de milhões de iterações mas cada uma sendo muito rápida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas assim nao tens totais.

ou podes ir adicionando tempos ao time span?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi...

Da forma que disse, o TimeSpan vai ser o tempo total. Não precisas de ir adicionando passo a passo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim vai ser sempre um novo a cada iteração, mas cada um indica o tempo total.

Supondo que cada iteração demora 1 segundo.

- Na 1ª iteração o TimeSpan vai ser 1 segundo

- Na 2ª iteração o TimeSpan vai ser 2 segundos

- Na 3ª iteração o TimeSpan vai ser 3 segundos

etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora