none
Countdown RRS feed

  • Domanda

  • Salve ragazzi, eccomi di nuovo con un problema (come al solito) sta volta sempre nello stesso programma di Shutdown dovrei fare un countdown, cioè mi spiego meglio: ho un NumeriUpDown dove inserisco un valore, questo valore lo faccio copiare in una textbox dove avverrà il countdown, però non so come farlo.. Ho cercato in rete ed ho visto che si potrebbe fare con l'istruzione If ma non l'ho capito molto bene perche non sapendo quale sarà il numero inserito nella NumericUpDown non so quanto mettere.. Per esempio "> di" "< di" non ne ho idea.. E poi vorrei che tale coutdown sia scritto su questa textbox.. Grazie in anticipo Andrea.
    sabato 21 gennaio 2012 00:12

Risposte

  • Ciao Andrea,

     

    se  il pc ancora non si spegne è perchè viene inviato un comando errato alla shell...potresti postare il comando che invii per spegnere il pc??

     

    Altrimenti aggiungi questo metodo(aggiungendo lo using System.Diagnostics)

    void Shutdown(){
    
    Process.Start("shutdown.exe", "-s -t 00");
    }


    e prova a richiamarlo da qualche parte del codice... in teoria dovrebbe funzionare senza problemi!

     

    Fammi sapere

    Ciao


    Carmine Punella
    Blog: Link
    sabato 21 gennaio 2012 11:32
  • Non hai provato a seguire il mio suggerimento precedente, ovvero eseguire il comando che imposti nella classe Process direttamente dalla riga di comando?

    Facendo una rapida prova, si trova subito la causa del problema. Nella riga

    Spegni.StartInfo.Arguments = "-s -t" + Numeric.Value;
    

    inserisci il numero di secondi attaccato al parametro -t, quindi il parametro risultante ha una forma del tipo -t20, quindi risulta non valido.

    Devi quindi aggiungere uno spazio dopo -t.

    Per quanto riguarda l'altro problema, è molto strano, perché ogni volta che scatta il timer, decrementi di 1 il valore di sec e lo mostri nella label, quindi dovresti vedere tutti i valori. Ho provato io stesso e funziona correttamente. Potrebbe trattarsi di un problema di aggiornamento dell'interfaccia. Prova a mettere l'istruzione

    Countdown.Refresh();
    

    Dopo aver aggiornato il valore dell'etichetta.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu martedì 24 gennaio 2012 15:33
    • Contrassegnato come risposta Irina Turcu martedì 31 gennaio 2012 13:09
    sabato 21 gennaio 2012 18:13
    Moderatore
  • Ciao Andrea1980345,

    Mmmm e come si fa per interrompere l'evento tick?

    trovo strano che non funzioni , se dalla casella degli strumenti inserisci un timer , doppio click , e all'interno dell'evento click metti la logica di spegnimento come indicato da Marco deve funzionare , vedi l'esempio seguente.

            private int _sec = 0;
    
            private void button7_Click(object sender, EventArgs e)
            {
                _sec = (int)this.Numeric.Value;
                timer1.Interval = 1000;
                timer1.Start();
            }
    
            private void timer1_Tick_1(object sender, EventArgs e)
            {
                _sec--;
                if (_sec == 0)
                {
                    //MessageBox.Show("Countdown Terminato");
                    timer1.Stop();
                    Process.Start("shutdown.exe", "-s -t " + Numeric.Value.ToString(CultureInfo.InvariantCulture));
                }
                else
                {
                    Countdown.Text = "Countdown" + _sec.ToString();                
                }        
            }
    

    Ciao.


    sabato 21 gennaio 2012 19:05
  • Allora, in questo post: http://stackoverflow.com/questions/1579878/c-sharp-countdown-timer-using-numericupdown-as-interval trovi proprio un semplice countdown che sfrutta il valore inserito in un controllo NumericUpDown. E' più semplice di quello che ti ho descritto, ma l'idea di funzionamento è la stessa.

    Qui: http://www.dreamincode.net/forums/topic/57482-countdown-timer/, invece, trovi un esempio un po' più complesso, che comunque ti consiglio di visionare perché ti aiuterà sicuramente ad approfondire l'argomento.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu martedì 24 gennaio 2012 15:33
    • Contrassegnato come risposta Irina Turcu martedì 31 gennaio 2012 13:09
    sabato 21 gennaio 2012 01:01
    Moderatore

Tutte le risposte

  • Puoi calcolare il tempo finale del countdown aggiungendo all'ora corrente il valore dei secondi specificati nel NumericUpDown:

    var countDownEnd = DateTime.Now.AddSeconds(Convert.ToInt32( numericUpDown1.Value));

    In questo modo, in countDownEnd hai un valore che ti indica esattamente quando deve finire il conto alla rovescia.

    Dopodiché, usi un Timer che scatta ogni secondo e in esso calcoli la differenza tra l'ora corrente e l'orario di fine:

    var remainingTime = countDownEnd - DateTime.Now;
    


    La variabile remainingTime è di tipo TimeSpan e rappresenta un intervallo di tempo, come descritto qui: http://msdn.microsoft.com/en-us/library/system.timespan.aspx. Puoi usare le sue proprietà per aggiore il valore del conto alla rovescia che mostri a video.

    Infine, quando il valore di remaininTime scende a 0, significa che il conto alla rovescia è finito.

    Spero di averti delineato con chiarezza lo scenario. Fammi sapere se qualcosa non ti è chiaro, sarò felice di aiutarti!


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 00:40
    Moderatore
  • Praticamente non ho capito nulla ahah scusami ma essendo agli inizii non capisco bene, potresti spiegarmelo un pò più chiaramente?
    sabato 21 gennaio 2012 00:46
  • Allora, in questo post: http://stackoverflow.com/questions/1579878/c-sharp-countdown-timer-using-numericupdown-as-interval trovi proprio un semplice countdown che sfrutta il valore inserito in un controllo NumericUpDown. E' più semplice di quello che ti ho descritto, ma l'idea di funzionamento è la stessa.

    Qui: http://www.dreamincode.net/forums/topic/57482-countdown-timer/, invece, trovi un esempio un po' più complesso, che comunque ti consiglio di visionare perché ti aiuterà sicuramente ad approfondire l'argomento.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu martedì 24 gennaio 2012 15:33
    • Contrassegnato come risposta Irina Turcu martedì 31 gennaio 2012 13:09
    sabato 21 gennaio 2012 01:01
    Moderatore
  • Grazie Marco! Funziona però il timer non scorre bene cioè non scende ad un ad uno tipo metto il valore "20" nella NumericUpDown e nella textbox dopo aver premuto il button mi appare 19 17 13 ecc ecc saltando dei numeri... Poi non ho chiaro delle cose del codice:
            private void button7_Click(object sender, EventArgs e)
            {
                sec = (int)this.Numeric.Value;
                Timer.Start();
            }
    
    
            private int sec;
    
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                Timer.Tick += new EventHandler(timer1_Tick);
                Timer.Interval = 1000;
                sec--;
                if (sec == 0)
                {
                    MessageBox.Show("Countdown Terminato");
                    Timer.Stop();
                }
                else
                    Countdown.Text = "Countdown" + sec.ToString();
            }
        }
    }
    
    


    La prima riga di codice del button7 cioè:

                sec = (int)this.Numeric.Value;
    
    


    Cosa vuol dire?

    E anche questa:

                else
                    Countdown.Text = "Countdown" + sec.ToString();
    

    Cosa starebbe a dire? Grazie in anticipo!

     

    sabato 21 gennaio 2012 02:58
  • Ah dimenticavo ancora non funziona cioè il pc non si spegne appare la solita schermata del cmd veloce che scompare e non succede nulla..
    sabato 21 gennaio 2012 03:01
  • Ciao Andrea1980345,

    Grazie Marco! Funziona però il timer non scorre bene cioè non scende ad un ad uno tipo metto il valore "20" nella NumericUpDown e nella textbox dopo aver premuto il button mi appare 19 17 13 ecc ecc saltando dei numeri... Poi non ho chiaro delle cose del codice:
            private void button7_Click(object sender, EventArgs e)
            {
                sec = (int)this.Numeric.Value;
                Timer.Start();
            }
    
    
            private int sec;
    
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                Timer.Tick += new EventHandler(timer1_Tick);
                Timer.Interval = 1000;
                sec--;
                if (sec == 0)
                {
                    MessageBox.Show("Countdown Terminato");
                    Timer.Stop();
                }
                else
                    Countdown.Text = "Countdown" + sec.ToString();
            }
        }
    }
    
    


    La prima riga di codice del button7 cioè:

                sec = (int)this.Numeric.Value;
    
    

     


    Cosa vuol dire?

    E anche questa:

                else
                    Countdown.Text = "Countdown" + sec.ToString();
    

    Cosa starebbe a dire? Grazie in anticipo!

     

     


    la prima riga significa che stai eseguendo un cast esplicito , ovvero convertire un numero decimal della proprietà Value del controllo Numeric in int  , mentre la seconda riga viene eseguita se la variaabile sec non e uguale a zero.

    Un altra cosa  , la righe dove dichiari un nuovo evento tick del timer e l'intervallo spostale nell'evento del pulsante prima di richiamare il metodo Start del timer.

    private int sec = 0;
    private void button7_Click(object sender, EventArgs e)
            {
                sec = (int)this.Numeric.Value;
                Timer.Tick += new EventHandler(timer1_Tick);
                Timer.Interval = 1000;
                Timer.Start();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                sec--;
                if (sec == 0)
                {
                    MessageBox.Show("Countdown Terminato");
                    Timer.Stop();
                }
                else
                    Countdown.Text = "Countdown" + sec.ToString();
            }
        }
    }
    
    

    Ciao.


    sabato 21 gennaio 2012 06:42
  • Ciao Andrea,

     

    se  il pc ancora non si spegne è perchè viene inviato un comando errato alla shell...potresti postare il comando che invii per spegnere il pc??

     

    Altrimenti aggiungi questo metodo(aggiungendo lo using System.Diagnostics)

    void Shutdown(){
    
    Process.Start("shutdown.exe", "-s -t 00");
    }


    e prova a richiamarlo da qualche parte del codice... in teoria dovrebbe funzionare senza problemi!

     

    Fammi sapere

    Ciao


    Carmine Punella
    Blog: Link
    sabato 21 gennaio 2012 11:32
  • Ah dimenticavo ancora non funziona cioè il pc non si spegne appare la solita schermata del cmd veloce che scompare e non succede nulla..

    Prova a prendere il comando che imposti nel tuo programma e ad eseguirlo manualmente in una finestra della shell, così puoi vedere se c'è qualche parametro errato.
    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 11:59
    Moderatore
  • Allora ragazzi grazie per le risposte, ma non funziona! Ne il timer ne lo spegnimento! Questi sono i rispettivi codici:
            private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show(Numeric.Value + "Allo spegnimento");
                Process Spegni = new Process();
                Spegni.StartInfo.Arguments = "-s -t" + Numeric.Value;
                Spegni.StartInfo.FileName = "C:\\Windows\\System32\\shutdown.exe";
                Spegni.Start();
            }
    


    E del timer e pulsante per avviarlo:

            private int sec = 0;
            private void button7_Click(object sender, EventArgs e)
            {
                sec = (int)this.Numeric.Value;
                Timer.Tick += new EventHandler(timer1_Tick);
                Timer.Interval = 1000;
                Timer.Start();
            }
    
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                sec--;
                if (sec == 0)
                {
                    MessageBox.Show("Countdown Terminato");
                    Timer.Stop();
                }
                else
                    Countdown.Text = "Countdown" + sec.ToString();
            }
        }
    }
    
    

    Il problema è il solito, il countdown non avviene correttamente, cioè salta dei numeri, invece lo shutdown non parte proprio cioè la solita schermata del cmd con tante scritte che compare e scompare subito, grazie in anticipo!

    sabato 21 gennaio 2012 17:57
  • Non hai provato a seguire il mio suggerimento precedente, ovvero eseguire il comando che imposti nella classe Process direttamente dalla riga di comando?

    Facendo una rapida prova, si trova subito la causa del problema. Nella riga

    Spegni.StartInfo.Arguments = "-s -t" + Numeric.Value;
    

    inserisci il numero di secondi attaccato al parametro -t, quindi il parametro risultante ha una forma del tipo -t20, quindi risulta non valido.

    Devi quindi aggiungere uno spazio dopo -t.

    Per quanto riguarda l'altro problema, è molto strano, perché ogni volta che scatta il timer, decrementi di 1 il valore di sec e lo mostri nella label, quindi dovresti vedere tutti i valori. Ho provato io stesso e funziona correttamente. Potrebbe trattarsi di un problema di aggiornamento dell'interfaccia. Prova a mettere l'istruzione

    Countdown.Refresh();
    

    Dopo aver aggiornato il valore dell'etichetta.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    • Proposto come risposta Irina Turcu martedì 24 gennaio 2012 15:33
    • Contrassegnato come risposta Irina Turcu martedì 31 gennaio 2012 13:09
    sabato 21 gennaio 2012 18:13
    Moderatore
  • ciao, per lo spegnimento segui i consigli di Marco usando la funzione che ti ho scritto prima  

    Process.Start("shutdown.exe", "-s -t 00");
    

     mentre per il countdown ho provato anche io e funziona senza problemi... quanti sono i secondi che ti salta??? salta sempre gli stessi???


    Carmine Punella
    Blog: Link
    sabato 21 gennaio 2012 18:24
  • Ciao Marco, scusami non avevo letto il messaggio che avevi scritto. Adesso funziona perfetto :) non mi funziona solo l'interruzione di arresto cioè "-a" però proverò a sistemarlo da solo. Comunque questo comando di refresh dove devo inserirlo?
    sabato 21 gennaio 2012 18:32
  • Comunque questo comando di refresh dove devo inserirlo?

    Dopo l'aggiornamento del valore dell'etichetta, ovvero:

    Countdown.Text = "Countdown" + sec.ToString();
    



    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 18:39
    Moderatore
  • Provato non funziona, il timer scende a due a due come prima cioè metto 20 e fa 20 18 16 14 12 10 ecc..
    sabato 21 gennaio 2012 18:46
  • Strano... Se metti un punto d'interruzione nel gestore dell'evento Tick, puoi verificare se la variabile sec assume tutti i valori?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 18:50
    Moderatore
  • Mmmm e come si fa per interrompere l'evento tick?
    sabato 21 gennaio 2012 18:54
  • Basta mettere un punto di interruzione nel suo codice di gestione (ad esempio la prima riga).
    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 18:56
    Moderatore
  • Ciao Andrea1980345,

    Mmmm e come si fa per interrompere l'evento tick?

    trovo strano che non funzioni , se dalla casella degli strumenti inserisci un timer , doppio click , e all'interno dell'evento click metti la logica di spegnimento come indicato da Marco deve funzionare , vedi l'esempio seguente.

            private int _sec = 0;
    
            private void button7_Click(object sender, EventArgs e)
            {
                _sec = (int)this.Numeric.Value;
                timer1.Interval = 1000;
                timer1.Start();
            }
    
            private void timer1_Tick_1(object sender, EventArgs e)
            {
                _sec--;
                if (_sec == 0)
                {
                    //MessageBox.Show("Countdown Terminato");
                    timer1.Stop();
                    Process.Start("shutdown.exe", "-s -t " + Numeric.Value.ToString(CultureInfo.InvariantCulture));
                }
                else
                {
                    Countdown.Text = "Countdown" + _sec.ToString();                
                }        
            }
    

    Ciao.


    sabato 21 gennaio 2012 19:05
  • Grazie mille Carmelo! Funziona, proticamente questa riga di codice
                timer1.Tick += new EventHandler(timer1_Tick);

    faceva fare il countdown del timer a due a due... Grazie mille a tutti!
    sabato 21 gennaio 2012 19:20
  • Adesso è chiaro... In pratica avevi definito l'handler per l'evento Tick nella finestra delle proprietà del controllo, ma poi a runtime lo definivi nuovamente, da qui il comportamento strano che hai notato.
    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    sabato 21 gennaio 2012 19:21
    Moderatore
  • Ciao Andrea1980345,

    Grazie mille Carmelo! Funziona, proticamente questa riga di codice
                timer1.Tick += new EventHandler(timer1_Tick);

    faceva fare il countdown del timer a due a due... Grazie mille a tutti!


    Prego , e stato un piacere aiutarti insieme a Marco e Carmine.

    Comunque la riga da te descritta generava un nuovo evento ad ogni click del pulsante , per cui vi era la possibilità di avre anche più due numeri saltati per volta.

    Ciao.


    sabato 21 gennaio 2012 19:23