andrepadez
Power Member
Esta não deve ser muito simples, mas espero que este thread ajude muita gente (para além de mim).
O primeiro projecto que agarrei para aprender C# tornou-se bem mais complicado do que esperava. Tem a ver com contadores de tempo, para quem jogue Poker, estou a falar de um Blind Timer. O programa está feito, sem bugs, mas precisa de ser aperfeiçoado.
Descrição:
Basicamente é um countdown de tempo até zero, em que o user define ao início quantos minutos e quantos segundos será o tempo limite. Duas labels (minutos e segundos) vão mostrando o tempo que faltam, e outra (lblTempoTotal) o tempo que já passou desde que o user clicou em start. Quando chega a zero aparece uma DialogBox perguntando se quer repetir, e em caso de resposta afirmativa volta a fazer o countdown com os mesmos parâmetros, continuando a contar o tempo na lblTempoTotal.
Solução:
Como ainda estava a aprender, escrevi o código imperativamente, não criei classes e ainda hoje não consigo conceber como poderia torná-lo mais Object-Oriented.
Descobri as classes DateTime e TimeSpan e foram elas a base do cálculo do tempo. Quando o user clica em Start (e agora vamos assumir que só nos preocupávamos com os segundos),
Depois é executado um while com as condições definidas pelos dados introduzidos pelo user em que:
(Este código é a versão simplificada, mas para já chega para o que quero ilustrar)
Problema (1):
a iteração deste while, como calculam, não é executado uma vez por segundo, mas sim muitas (penso que um pouco menos de mil por seg, precisei de calcular essa precisão para algo que explicarei mais tarde). Assim, quando o cronómetro está a funcionar se for executada qualquer função no windows, por menor que seja (mover a própria form ou abrir outra janela por ex), o meu programa fica sem responder. As labels deixam de se actualizar, parece que breakou até ao tempo chegar a zero e aí ele responde como devia.
Perguntas para problema 1:
a) - Há alguma função de pause que eu possa inserir no while de forma a ele só correr uma ou duas iterações por segundo para não sobrecarregar o processador??? E esta solução resolve-me o problema de não poder fazer outra coisa no windows enquanto o tempo está a contar?
b) - Há alguma maneira de conseguir (caso precise para os milissegundos), colocar o processamento deste processo em paralelo (background ou assim) de modo a que possa mexer no windows à vontade e o programa continue a funcionar normalmente???
Para já são estas as questões mais prementes. Quando conseguir resolver isto com a vossa ajuda, colocarei mais questões relativas ao mesmo.
Se alguem quiser o código fonte ou o executável, PM me que eu mando a Solution do Visual C# por mail.
Obrigado por tudo
Abraços
O primeiro projecto que agarrei para aprender C# tornou-se bem mais complicado do que esperava. Tem a ver com contadores de tempo, para quem jogue Poker, estou a falar de um Blind Timer. O programa está feito, sem bugs, mas precisa de ser aperfeiçoado.
Descrição:
Basicamente é um countdown de tempo até zero, em que o user define ao início quantos minutos e quantos segundos será o tempo limite. Duas labels (minutos e segundos) vão mostrando o tempo que faltam, e outra (lblTempoTotal) o tempo que já passou desde que o user clicou em start. Quando chega a zero aparece uma DialogBox perguntando se quer repetir, e em caso de resposta afirmativa volta a fazer o countdown com os mesmos parâmetros, continuando a contar o tempo na lblTempoTotal.
Solução:
Como ainda estava a aprender, escrevi o código imperativamente, não criei classes e ainda hoje não consigo conceber como poderia torná-lo mais Object-Oriented.
Descobri as classes DateTime e TimeSpan e foram elas a base do cálculo do tempo. Quando o user clica em Start (e agora vamos assumir que só nos preocupávamos com os segundos),
Código:
DateTime inicio = DateTime.Now;
DateTime agora = DateTime.Now;
TimeSpan diferenca = agora.Subtract(inicio)
lblSegundos.Text = (limiteSegundos - diferenca.Seconds).ToString();
lblSegundos.Refresh();
Depois é executado um while com as condições definidas pelos dados introduzidos pelo user em que:
Código:
agora = DateTimeNow;
diferenca = agora.Subtract(inicio);
lblSegundos.Text = (limiteSegundos - diferenca.Seconds).ToString();
lblSegundos.Refresh();
(Este código é a versão simplificada, mas para já chega para o que quero ilustrar)
Problema (1):
a iteração deste while, como calculam, não é executado uma vez por segundo, mas sim muitas (penso que um pouco menos de mil por seg, precisei de calcular essa precisão para algo que explicarei mais tarde). Assim, quando o cronómetro está a funcionar se for executada qualquer função no windows, por menor que seja (mover a própria form ou abrir outra janela por ex), o meu programa fica sem responder. As labels deixam de se actualizar, parece que breakou até ao tempo chegar a zero e aí ele responde como devia.
Perguntas para problema 1:
a) - Há alguma função de pause que eu possa inserir no while de forma a ele só correr uma ou duas iterações por segundo para não sobrecarregar o processador??? E esta solução resolve-me o problema de não poder fazer outra coisa no windows enquanto o tempo está a contar?
b) - Há alguma maneira de conseguir (caso precise para os milissegundos), colocar o processamento deste processo em paralelo (background ou assim) de modo a que possa mexer no windows à vontade e o programa continue a funcionar normalmente???
Para já são estas as questões mais prementes. Quando conseguir resolver isto com a vossa ajuda, colocarei mais questões relativas ao mesmo.
Se alguem quiser o código fonte ou o executável, PM me que eu mando a Solution do Visual C# por mail.
Obrigado por tudo
Abraços