2010-06-22 18 views
8

Vì vậy, tôi đang thực hiện trò chơi phá gạch đơn giản trong C#/wpf. Tôi đang chạy vào một vấn đề bằng cách sử dụng bộ đếm thời gian, tôi cảm thấy như nó có lẽ là một sửa chữa đơn giản nhưng đây là những gì đang xảy ra. Bất cứ khi nào t_Elapsed được bắn nó cố gắng để gọi Update() nhưng khi nó không giống như OMG Im của nó không đúng chủ đề vì vậy tôi không thể làm điều đó thưa ông. Làm cách nào để gọi phương thức từ Trò chơi từ chuỗi thích hợp? (Và vâng tôi biết mã là xấu xí và có con số ma thuật nhưng tôi chỉ kinda chugged nó ra mà không tiêu tốn rất nhiều công sức vào. Và vâng tôi có zero trò chơi kinh nghiệm lập trình)Chuỗi cuộc gọi không thể truy cập đối tượng này vì một chủ đề khác sở hữu nó

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 Im không nằm trong chủ đề đúng vì vậy tôi không thể làm sir.' đó <3 – Laserbeak43

Trả lời

11

Bạn nên sử dụng các đối tượng DispatcherTimer thay vào đó, nó sẽ đảm bảo rằng các sự kiện hẹn giờ được xuất bản cho các chủ đề chính xác.

+0

Có hơi API khác nhau. Giống như ElapsedTimeEvent hiện được đặt tên là TickEvent. Nhưng sau khi chuyển sang API mới, nó hoạt động tốt với chuỗi giao diện người dùng! Tôi thích .NET vì có giải pháp nhanh cho hầu hết mọi dịp;) – OneWorld

5

Sự kiện thời gian đã trôi qua sẽ kích hoạt trên một sợi từ hồ bơi chủ đề (http://www.albahari.com/threading/part3.aspx#_Timers) chứ không phải trên chuỗi giao diện người dùng. Cách tiếp cận của bạn tốt nhất là để gọi điều phối của kiểm soát thông qua một cuộc gọi như thế này:

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

     return null; 
    }), null); 
+1

+1 DispatcherTimer không hoạt động, đây là những gì đã làm cho tôi –

Các vấn đề liên quan