2010-03-19 14 views
9

ho uno strano problema ... Ho passato fuori di testa da un paio d'ore ... il timer che ho inserito nel mio codice winform (dalla barra degli strumenti) non ticcherà ...Il timer C# non ticcherà

Ho temporizzatori su un paio di moduli nel mio programma, funzionano tutti bene ... cerco di fare esattamente lo stesso in questo modo non ticcherà ... Seleziono lo trascina su un modulo, lo abilita, imposta l'intervallo e gestisce l'evento tick ... e non succede nulla ... ho persino provato a inserire un codice casuale come messagebox.show nell'evento tick per vedere se succede qualcosa, e niente!!! come ho detto, ho un altro paio di timer nel mio programma (su altre forme, non in quello che sto cercando di mettere questo timer) e funzionano tutti bene ...

qualche suggerimento?

grazie in anticipo!

+2

po 'di codice sarebbe di aiuto. – Shoban

+0

è il codice standard generato dallo studio visivo per i timer ... this.timer1 = new System.Windows.Forms.Timer (this.components); private System.Windows.Forms.Timer timer1; this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick + = new System.EventHandler (this.timer1_Tick_1); vuoto privato timer1_Tick_1 (oggetto mittente, EventArgs e) { MessageBox.Show ("TIMER TICKS"); } – Andrej

+0

Hai iniziato? – Jake

risposta

6

Assicurarsi che si avvia chiamando timer1.Start()

+1

+1 Trovo che molte persone non lo facciano :) –

+1

Sì, sono stato morso da me stesso alcune volte –

+2

. Abilitato = true dovrebbe essere sufficiente. –

7

non lo fanno System.Windows.Forms.Timer avvio del timer sul .enabled ... comunque .. ho appena preso a lavorare ... ho copiato il visual Studio generadted WINFORMNAME.designer.cs sotto forma di codice a WINFORMNAME.cs ... non so come e perché ma ha funzionato ...

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
timer.Enabled = true; 
timer.Interval = 1000; 
timer.Tick += new EventHandler(timer_Tick); 
     void timer_Tick(object sender, EventArgs e) 
     { 
//do something 
     } 

grazie a tutti per le risposte!

9

Ho scoperto che se interrompo il timer da un thread non UI, quindi lo riavvio, perdo il hook dell'evento.

Non so quale sia la risposta "corretta" è, ma questo ha funzionato abbastanza bene per me:

public class BetterTimer : System.Windows.Forms.Timer 
{ 
    public BetterTimer():base()   
    { base.Enabled = true; } 

    public BetterTimer(System.ComponentModel.IContainer container) : base(container) 
    { base.Enabled = true; } 

    private bool _Enabled; 
    public override bool Enabled 
    { 
     get { return _Enabled; } 
     set { _Enabled = value; } 
    } 

    protected override void OnTick(System.EventArgs e) 
    { if (this.Enabled) base.OnTick(e); } 
} 

Tre cose da questo approccio:

1) sovrascrivendo il costruttori, ho assicurarsi che il timer di base sia abilitato dall'inizio.

2) Con Overrideing "Abilitato", non ho mai lasciato disattivare il timer di base, ma l'interfaccia non cambia.

3) Sovrascrivendo "OnTick", lascio che la proprietà Enabled sostituita decida se l'evento deve essere attivato o meno.

Start() e Stop() funzionano impostando rispettivamente true e false sulla proprietà Enabled.

BTW - qualcuno sa perché l'evento non si attiva mai (o è disconnesso?) Quando il timer viene arrestato/disabilitato da un thread non UI?

+1

Questo l'ha risolto per me. Arresta/avvia sempre un System.Windows.Forms.Timer sul thread dell'interfaccia utente, apparentemente! – user1454265

+0

Questa è stata una risposta molto utile. Grazie mille ! :) –

2

Per rispondere alla tua ultima domanda, non è consentito manipolare i controlli creati su un altro thread. Puoi invocare tramite delegati.

+0

In un problema non correlato, benché risolto, non ero sicuro del motivo per cui le mie chiamate .Show() o .ShowDialog() non funzionassero. Stavo facendo chiamate incrociate. Questa affermazione mi ha aiutato a capirlo. Grazie. –

1

Mi sono imbattuto in questo prima. Stavo abilitando il timer prima di impostare l'intervallo. Scambiare le due linee ha funzionato.

0

Ho avuto lo stesso problema di Andrej e ho provato diverse soluzioni che ho trovato sul web.

ho avuto termine per ogni modulo nel mio programma (conto alla rovescia) ed ecco come ho risolto:

ho usato soluzione ingegneria informatica. spegnilo e riaccendilo !! :)) Voglio dire, non so perché, ma funziona !!

prima di tutto ho cancellato tutti i timer da .cs e dal design quindi ho aggiunto un timer in ogni modulo e ho inserito il nome diverso per il timer e la casella di testo e ho scritto lo stesso codice uno per uno.

Ho appena timer.start utilizzato() e Timer.stop()

private void Form7_Load_1(object sender, EventArgs e) 
    { 
     timer7.Start(); 
    } 

    int duration = 30; 

    private void timer7_Tick(object sender, EventArgs e) 
    { 
     duration--; 
     textBox7.Text = duration.ToString(); // to show the countdown 

     if (duration == 0) 
     { 
      timer7.Stop(); 
      MessageBox.Show("You ran out of time. Please go to the next page"); 

      this.Hide(); 
      Form8 f8 = new Form8(); 
      f8.ShowDialog(); 
     } 
    } 

Speranza che aiuta