C#, dotNet, Processos

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),
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
 
Ok, se isso funcionar como penso que funciona está óptimo, responde-me totalmente à primeira pergunta. THX
Quanto à segunda, alguem tem sugestões?
 
O Timer é a solução para as 2 questões. Esquece o While para controlar o tempo.

obrigado, eu já percebi isso.

a segunda questão já saiu do âmbito deste projecto:
Quero saber, caso precise de ter um ciclo a funcionar permanentemente, a gerar informação, se consigo ter outras instruções a correr em paralelo.

Obrigado
 
obrigado, eu já percebi isso.

a segunda questão já saiu do âmbito deste projecto:
Quero saber, caso precise de ter um ciclo a funcionar permanentemente, a gerar informação, se consigo ter outras instruções a correr em paralelo.

Obrigado

Sim, lançando várias Threads dentro do mesmo processo. Isto resolve o problema da aplicação deixar de responder.
 
Back
Topo