2011-04-20 31 views
13

Hola, he entrado en un problema relacionado con el temporizador. esperanza alguien puede ayudar ..iniciar un temporizador de hilo diferente en C#

  1. que tiene forma de ventana que contiene un botón
  2. cuando hago clic en ese botón i iniciar un hilo parametrizado
Thread thread1 = new Thread(new ParameterizedThreadStart(execute2)); 
thread1.Start(externalFileParams); 
  1. el código dentro del hilo se ejecuta muy bien
  2. en la última línea de este hilo, comienzo un temporizador

.

public void execute2(Object ob) 
{ 
    if (ob is ExternalFileParams) 
    { 
     if (boolean_variable== true) 
      executeMyMethod();//this also executes very well if condition is true 
     else 
     { 
      timer1.enabled = true; 
      timer1.start(); 
      } 
     } 
    } 
} 

5 pero el evento Tick del temporizador no se dispara

estoy trabajando en VS2008 3,5 marco. Me he arrastrado el temporizador de la caja de herramientas y establecer su Interval a 300 también trataron de establecer Enabled verdadero falso método/es timer1_Tick(Object sender , EventArgs e) pero no es despedido

puede sugerir a nadie lo que estoy haciendo mal?

+2

Es muy poco probable que esta sea la mejor manera de lograr lo que desea: si tiene una tarea larga que necesita actualizar un formulario con progreso, entonces BackgroundWorker es una buena forma de hacerlo. Si necesita más control manual, un hilo de agrupación (vea ThreadPool.QueueUserWorkItem) es mejor que crear su propio subproceso. –

+0

necesitaría invocar el timer.start en el hilo de su formulario/control de host, pero es una forma incómoda de hacerlo. Use 'Control.BeginInvoke' para llamar a un delegado apropiado. – Jodrell

Respuesta

18


Se podría tratar de iniciar el temporizador de esta manera:

Agregar en forma constructor de esto:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
// Set the Interval to 1 second. 
aTimer.Interval = 1000; 

Añadir este método a Form1:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //do something with the timer 
} 

El botón de evento de clic Añada esto:

aTimer.Enabled = true; 

Este temporizador ya está enhebrado, por lo que no es necesario iniciar un nuevo hilo.

3

System.Windows.Forms.Timer funciona en una aplicación de subproceso único.

Comprobar este enlace:

Observaciones dice:

un temporizador se utiliza para elevar un evento en intervalos definidos por el usuario. Este temporizador de Windows está diseñado para un entorno de subproceso único donde los subprocesos UI se utilizan para realizar el proceso . Requiere que el código de usuario tenga una bomba de mensaje UI disponible y siempre opere desde el mismo hilo , o marque la llamada en otro hilo.

Lea más "Observaciones" y encontrará que Microsoft recomienda que use este temporizador sincronizándolo con el subproceso de la interfaz de usuario.

+0

Hay una solución para esto, ver mi respuesta – 321X

+0

Jaja, lea mi última oración (¡estuvo allí durante una hora!) :) ¡Gracias de todos modos! –

+0

Haha :-) ¡Malo! – 321X

7

Es cierto lo que dice Matías Fidemraizer. Pero, hay un trabajo alrededor ...

Cuando tiene un control en su formulario que es invocable (por ejemplo, una barra de estado), ¡solo invoque ese!

C muestra # Código:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Thread sampleThread = new Thread(delegate() 
    { 
     // Invoke your control like this 
     this.statusStrip1.Invoke(new MethodInvoker(delegate() 
     { 
      timer1.Start(); 
     })); 
    }); 
    sampleThread.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    MessageBox.Show("I just ticked!"); 
} 
1

Yo usaría un BackgroundWorker (en lugar de una prima hilo ). El hilo principal se suscribiría al RunWorkerCompleted event del trabajador: el evento se dispara en su hilo principal cuando se completa el hilo. Use este controlador de eventos para reiniciar su temporizador.

Cuestiones relacionadas