2009-07-23 4 views
14

Sto provando a far spuntare un timer una volta al secondo in una winform, quando cerco un consiglio su come farlo trovo un sacco di cose sui thread. Beh, non mi importa dei thread, perché tutto quello che sto cercando di fare è fare un conto alla rovescia da 60 a 0 in un minuto, poi fermarsi. Non penso che sia necessario passare al cloud computing per risolvere questo problema, ma sono davvero un web forms bod, quindi sono un po 'arrugginito su questo problema. Qualcuno mi può indicare un esempioWinforms Timer for Dummies

Ecco quello che ho cercato

private void button1_Click(object sender, EventArgs e) 
    { 
     this.timeLeft = 60; 
     this.label1.Visible = false; 
     this.button1.Visible = false; 
     gt = new Timer(); 
     gt.Tick += new EventHandler(CountDown); 
     gt.Interval = 1000; 
     gt.Start(); 
    } 

private void CountDown(object sender, EventArgs e) 
{ 
    do 
    { 
     this.TimeBar.Value = timeLeft;     
     this.timeLeft -= 1; 
    } while (this.timeLeft > 0); 
    if (this.TimeBar.Value > 0) return; 
    gt.Stop(); 
    this.label1.Visible = true; 
    this.button1.Visible = true; 
} 

Qualsiasi aiuto sarebbe apprezzato.

risposta

8

Quello che sta accadendo è che stai diminuendo la variabile timeLeft fino a quando non raggiunge lo zero al primo tick del timer. Elimina il ciclo do...while e avresti un esempio funzionante.

Tuttavia, se si sta eseguendo una quantità di Windows Form, è necessario conoscere il thread e il modo in cui questo influisce sull'interfaccia utente. Ti ritroverai molto presto qui, se non con storie di eccezioni inutili e componenti dell'interfaccia utente scorretti. Jon Skeet ha un eccellente threading series. Lo consiglio vivamente. Ha una sezione dedicata ai timer, quindi potrebbe darti qualche informazione in più.

+0

E non dimenticare di disattivare il timer dopo che il conto alla rovescia è finito, altrimenti ti imbatterai in numeri negativi. –

+0

Grazie, è piuttosto tardi qui, ovviamente non ho bisogno del ciclo, doh! Grazie anche per il link ai documenti di threading di Mr Skeet. :) –

+0

@Martinho - Obligado, sì, quello mi ha preso anche io :) –

8

Si non utilizzare se si utilizza il timer di winforms.

cadere un controllo Timer sulla tua pagina, il nome "timer" e incollare il seguente codice:

public MainForm() 
{ 
    InitializeComponent(); 

    timer.Interval = 1000; 
    timer.Start(); 

    timeLeft = 60; 
    timer.Tick += Timer_Tick; 

    // start things 
    label1.Hide(); 
    button1.Hide(); 
    timer.Start(); 

} 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    timeLeft--; 

    if (timeLeft <= 0) { 
     timer.Stop(); 
     label1.Show(); 
     button1.Show(); 
    } 
} 

Suppongo che se siete arrivati ​​da un background Webby, programmazione eventi-driven è probabilmente la cosa devi iniziare a leggere se vuoi capire come sono programmate le cose sui desktop.

+0

Grazie, sì, la discussione era solo rumore, l'ho risolto ora, ma ho anche dei buoni indicatori di lettura. –

2

Non si desidera eseguire alcun ciclo nel gestore eventi. Il gestore viene chiamato una volta per timer "tick" - ogni 1000 millisecondi, come lo hai configurato. Pertanto, si desidera ridurre la variabile timeLeft una volta per chiamata, quindi interrompere l'intera operazione quando lo timeLeft raggiunge zero.

// untested 
private void CountDown(object sender, EventArgs e) 
{ 
    this.TimeBar.Value = timeLeft; 
    this.timeLeft--; 
    if (this.TimeBar.Value == 0) 
    { 
     gt.Stop(); 
     this.label1.Visible = true; 
     this.button1.Visible = true; 
    } 
} 
+0

Grazie, stavo solo avendo un po 'di svanito del cervello, facendo un piccolo progetto per mia figlia da usare, a causa della povera TV qui. Il tuo codice è praticamente quello che ho finito. –

3

Oltre a prendere il ciclo (come da risposta di JasonH), il vostro approccio potrebbe diventare un po 'imprecisa se l'applicazione è una specie di occupato. Sebbene si specifichi il loro intervallo in millisecondi, i timer WinForms hanno una risoluzione di 18 ms e hanno una priorità molto bassa, il ciclo del messaggio controlla solo i timer se non trova nient'altro da fare.

Quindi, mantenere un valore StartTime (DateTime) e utilizzarlo per calcolare il tempo rimanente in ogni evento Timer. Potresti aver bisogno di 61 tick per raggiungere un minuto.

+0

Sì, il timer è preciso a circa 55 ms che ho letto. Sta solo facendo qualcosa di veramente banale, quindi + -3 secondi in un minuto lo faranno, gli altri processi non infrangeranno la banca. Grazie comunque :) –