2010-06-22 30 views
8

Así que estoy haciendo un juego simple de romper ladrillos en C#/wpf. Me encuentro con un problema con los temporizadores. Siento que probablemente sea una solución simple, pero esto es lo que está sucediendo. Cada vez que se activa t_Elapsed intenta llamar a Update() pero cuando lo hace es como OMG Im no está en el hilo correcto, así que no puedo hacer eso señor. ¿Cómo invoco el método del juego del hilo apropiado? (Y sí sé que el código es feo y tiene números mágicos pero sólo un poco remontado a cabo sin poner mucho esfuerzo. Y sí lo tienen cero juegos de programación experiencia)El hilo que llama no puede acceder a este objeto porque lo posee un hilo diferente

public partial class Game : Grid 
{ 
    public bool running; 
    public Paddle p; 
    public Ball b; 
    Timer t; 

    public Game() 
    { 
     Width = 500; 
     Height = 400; 
     t = new Timer(20); 
     p = new Paddle(); 
     b = new Ball(); 
     for (int i = 15; i < 300; i += 15) 
     { 
      for (int j = 15; j < 455; j += 30) 
      { 
       Brick br = new Brick(); 
       br.Margin = new Thickness(j, i, j + 30, i + 15); 
       Children.Add(br); 
      } 
     } 
     Children.Add(p); 
     Children.Add(b); 
     p.Focus(); 
     t.AutoReset = true; 
     t.Start(); 
     t.Elapsed += new ElapsedEventHandler(t_Elapsed); 
    } 

    void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     if (running) 
     { 
      Update(); 
     } 
    } 

    void Update() 
    { 
     b.Update(); //Error here when Update is called from t_Elapsed event 
    } 

    void Begin() 
    { 
     running = true; 
     b.Initiate(); 
    } 
} 
+0

'OMG no estoy en el hilo derecho por lo que no puede hacer eso sir.' <3 – Laserbeak43

Respuesta

11

debería utilizar el objeto DispatcherTimer en cambio, asegurará que los eventos del temporizador se publiquen en el hilo correcto.

+0

se encuentra muy levemente API diferente Al igual que ElapsedTimeEvent, ahora se llama TickEvent. ¡Pero después de migrar a una nueva API funciona de maravilla con el hilo de UI! Me encanta .NET por tener una solución rápida para casi todas las ocasiones;) – OneWorld

5

Los eventos del temporizador transcurrido desencadenan un hilo del grupo de subprocesos (http://www.albahari.com/threading/part3.aspx#_Timers) y no en el subproceso de la interfaz de usuario. Su mejor enfoque es invocar despachador del control a través de una llamada como ésta:

yourControl.Dispatcher.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.Normal 
    , new System.Windows.Threading.DispatcherOperationCallback(delegate 
    { 
     // update your control here 

     return null; 
    }), null); 
+1

+1 DispatcherTimer no funcionó, esto es lo que hizo por mí –

Cuestiones relacionadas