1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C#, dotNet, Processos

Discussão em 'Programação' iniciada por andrepadez, 16 de Abril de 2008. (Respostas: 5; Visualizações: 2280)

  1. andrepadez

    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
     
  2. stradale

    stradale [email protected] Member

    Usa um Timer control (System.Windows.Forms.Timer).

    Metes o intervalo (.Interval) para 1000 (está em milisegundos) e o código que queres executar (neste caso labelQqCoisa.Text=abc) dentro do evento Timer.Tick.

    Para iniciares o timer chamas Timer.Start.

    Tens um exemplo aqui: http://www.csharphelp.com/archives/archive90.html
     
  3. andrepadez

    andrepadez Power Member

    Ok, se isso funcionar como penso que funciona está óptimo, responde-me totalmente à primeira pergunta. THX
    Quanto à segunda, alguem tem sugestões?
     
  4. SoundSurfer

    SoundSurfer Power Member

    O Timer é a solução para as 2 questões. Esquece o While para controlar o tempo.
     
  5. andrepadez

    andrepadez Power Member

    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
     
  6. SoundSurfer

    SoundSurfer Power Member

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

Partilhar esta Página