2010-03-19 21 views
9

tengo un problema extraño ... He estado saliendo de mi mente en las últimas dos horas ... el temporizador lo puse en mi código winform (desde la barra de herramientas) no marcará ...C# timer no marcará

Tengo temporizadores en un par de formularios en mi programa, todos funcionan bien ... Intento hacer exactamente lo mismo, esto no marcará ... Seleccioné , arrástralo a un formulario, habilítalo, establece el intervalo y maneja el evento tic ... y no pasa nada ... Incluso traté de poner código aleatorio como messagebox.show en el evento tick solo para ver si pasa algo, ¡¡¡y nada!!! como dije, tengo un par de temporizadores más en mi programa (en otras formas, no en la que intento poner este temporizador) y todos funcionan bien ...

¿Alguna sugerencia?

gracias de antemano!

+2

algún código ayudaría. – Shoban

+0

es el código generado por el estudio visual estándar para los temporizadores ... this.timer1 = new System.Windows.Forms.Timer (this.components); sistema privado.Windows.Forms.Timer timer1; this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick + = new System.EventHandler (this.timer1_Tick_1); private void timer1_Tick_1 (remitente del objeto, EventArgs e) { MessageBox.Show ("TIMER TICKS"); } – Andrej

+0

¿Lo comenzaste? – Jake

Respuesta

6

Asegúrese de que se inicia llamando timer1.Start()

+1

+1 Me parece que mucha gente no hace esto :) –

+1

Sí, me he mordido esto unas pocas veces –

+2

.Enabled = true debería ser suficiente. –

7

No System.Windows.Forms.Timer inicio del temporizador en .enabled ... en fin .. sólo tengo que funcione ... He copiado el estudio visual generadted forma de código WINFORMNAME.designer.cs a WINFORMNAME.cs ... no sé cómo y por qué, pero funcionó ...

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 
     } 

gracias a todos por las respuestas!

9

He encontrado que si detengo el temporizador de un hilo que no es de la interfaz de usuario, y luego lo reinicio, pierdo el enlace del evento.

No sé cuál es la respuesta "correcta" es, pero esto funcionó bastante bien para mí:

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); } 
} 

Tres cosas a este enfoque:

1) Reemplazando los constructores, me asegúrese de que el temporizador base esté habilitado desde el principio.

2) Al anular "Habilitado", nunca dejo que el temporizador base se deshabilite, pero la interfaz no cambia.

3) Al anular "OnTick", dejo que la propiedad Habilitada invalidada decida si el evento debe activarse o no.

Start() y Stop() funcionan configurando true y false en la propiedad Enabled, respectivamente.

BTW - ¿Alguien sabe por qué el evento nunca se dispara (o se desconecta?) Cuando el temporizador se detiene/inhabilita desde un subproceso no relacionado con la interfaz de usuario?

+1

Esto lo resolvió para mí. ¡Siempre pare/inicie System.Windows.Forms.Timer en el hilo de UI, aparentemente! – user1454265

+0

Esa fue una respuesta muy útil. Muchas gracias ! :) –

2

Para responder a su última pregunta, no está permitido manipular los controles que se crean en otra secuencia. Puede invocar a través de delegados.

+0

En un problema no relacionado, aunque resuelto, no estaba seguro de por qué mis llamadas .Show() o .ShowDialog() no funcionaban. Estaba haciendo llamadas cruzadas. Esta declaración me ayudó a resolverlo. Gracias. –

1

Me he encontrado con esto antes. Estaba habilitando el temporizador antes de establecer el intervalo. Intercambiar las dos líneas lo hizo funcionar.

0

Tuve el mismo problema que Andrej y he intentado varias soluciones que encontré en la web.

que tenían límite de tiempo para cada forma en mi programa (cuenta atrás) y aquí es cómo lo resolvió:

que usa solución de ingeniería informática. ¡apáguelo y enciéndelo otra vez! :)) Quiero decir que no sé por qué pero funciona.

antes que nada Borré todos los temporizadores de .cs y diseño luego agregué un temporizador en cada formulario y puse el nombre diferente para el temporizador y el cuadro de texto y escribí el mismo código uno por uno.

acabo timer.start utilizado() y 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(); 
     } 
    } 

creo que sirve