Utilizzo di una label durante un timer

di il
2 risposte

Utilizzo di una label durante un timer

Ciao ragazzi,leggendo il titolo penserete "Eh?" ma non sapevo cosa scrivere.....il problema è che ho creato un timer e quando si inseriscono i dati e si clicca sul pulsante per l'avvio,in una label dovrebbe spuntare un testo che avvisa l'utente che il timer è stato programmato e anche a che ora è stato programmato.

            int OraA = DateTime.Now.Hour;
            int MinutoA = DateTime.Now.Minute;

            TempoA.Text = "Il timer è stato programmato alle " + OraA + ":" + MinutoA;

            int Ora;
            int Minuto;
            int Secondo;
            int Tempo;

            Ora = int.Parse(O.Text);
            Minuto = int.Parse(M.Text);
            Secondo = int.Parse(S.Text);

            Ora = Ora * 3600;
            Minuto = Minuto * 60;
            Tempo = Ora + Minuto + Secondo;

            do
            {
                Thread.Sleep(1000);
                Tempo = Tempo - 1;
            }
            while (Tempo != 0);

            Form2 frm = new Form2();
            frm.Show();
Secondo il codice sorgente il testo di TempoA.text dovrebbe precedere il conteggio del timer,ma durante l'esecuzione del programma,quando si clicca sul pulsante prima fa il conteggio e quando arriva a Tempo arriva a 0 spunta il testo su TempoA.text.....non riesco a sistemarlo vorrei che quando si clicca il pulsante prima spunti il testo e subito dopo inizi il conteggio,aiutatemi programmatori

2 Risposte

  • Re: Utilizzo di una label durante un timer

    Ciao Wolt

    Questo esempio è equivalente al tuo:
    
    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Start";
        int Tempo = 10;          
        do
        {
             Thread.Sleep(1000);
             Tempo = Tempo - 1;
        }
        while (Tempo != 0);
        label1.Text = "End";
    }
    
    Se richiami questa funzione il form si blocca (ad es non riesci a spostarlo col mouse) e la label verrà scritta solo alla fine, per cui non vedrai mai 'Start' ma solo 'End'.

    Windows, e in genere tutti gli ambienti con interfaccia grafica sono 'Event driven', ad esempio la richiesta di scrittura di una label è per l' appunto una richiesta, non viene eseguita subito, ma dopo, in un apposito ciclo. Se scrivi un loop che dura un certo tempo blocchi il ciclo di gestione degli eventi.

    Puoi 'usare Application.DoEvent' che permette al sistema operativo di eleborare gli eventi.
    
    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Start";
        int Tempo = 10;
        Application.DoEvents();           
        do
        {
             Thread.Sleep(1000);
             Tempo = Tempo - 1;
        }
        while (Tempo != 0);
        label1.Text = "End";
    }
    
    Con questa versione, vedrai apparire 'Begin', ma poi il tuo form rimane bloccato (hai bucato la funzioe ma non il loop)
    
    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Start";
        int Tempo = 10;       
        do
        {
             Application.DoEvents();
             Thread.Sleep(1000);
             Tempo = Tempo - 1;
        }
        while (Tempo != 0);
        label1.Text = "End";
    }
    
    Con questa invece riesci a muovere il form, anche se a scatti di un secondo (hai bucato il loop ma lo sleep è lungo).

    La tecnica giusta sarebbe quella di usare un Timer (System.Windows.Forms.Timer).
  • Re: Utilizzo di una label durante un timer

    barba59 ha scritto:


    Ciao Wolt
    Se richiami questa funzione il form si blocca (ad es non riesci a spostarlo col mouse) e la label verrà scritta solo alla fine, per cui non vedrai mai 'Start' ma solo 'End'.
    Sisi infatti una volta settato il timer se si doveva chiudere prima si doveva aprire la gestione attività

    barba59 ha scritto:


    Puoi 'usare Application.DoEvent' che permette al sistema operativo di eleborare gli eventi.
    Ho provato e funziona perfettamente grazie a te adesso il mio timer è completo
Devi accedere o registrarti per scrivere nel forum
2 risposte