2010-06-22 14 views
8

है इसलिए मैं सी #/डब्ल्यूपीएफ में एक साधारण ईंट ब्रेकिंग गेम बना रहा हूं। मैं टाइमर का उपयोग कर किसी समस्या में भाग रहा हूं, मुझे लगता है कि यह शायद एक साधारण फिक्स है लेकिन यहां क्या हो रहा है। जब भी t_Elapsed निकाल दिया जाता है तो यह अद्यतन() को कॉल करने का प्रयास करता है, लेकिन जब यह ओएमजी की तरह करता है तो मैं सही धागे में नहीं हूं इसलिए मैं उस सर को नहीं कर सकता। मैं उचित धागे से खेल से विधि कैसे शुरू करूं? (और हाँ मैं जानता हूँ कि कोड बदसूरत है और जादू संख्या है, लेकिन मैं सिर्फ थोड़े में प्रयास के एक बहुत डाले बिना यह पता chugged। और हाँ मैं शून्य अनुभव प्रोग्रामिंग खेल है)कॉलिंग थ्रेड इस ऑब्जेक्ट तक नहीं पहुंच सकता है क्योंकि एक अलग थ्रेड का मालिक

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 इम नहीं सही सूत्र में तो मुझे लगा कि sir.' नहीं कर सकते <3 – Laserbeak43

उत्तर

11

आप DispatcherTimer वस्तु का उपयोग करना चाहिए इसके बजाए, यह सुनिश्चित करेगा कि टाइमर घटनाएं सही धागे पर प्रकाशित होंगी।

+0

थोड़ा है अलग एपीआई। ElapsedTimeEvent की तरह अब टिकिकेंट नाम दिया गया है। लेकिन नए एपीआई में माइग्रेट करने के बाद यह यूआई थ्रेड के साथ बहुत अच्छा काम करता है! मुझे लगभग हर अवसर के लिए त्वरित समाधान करने के लिए .NET से प्यार है;) – OneWorld

5

टाइमर थ्रेड पूल (http://www.albahari.com/threading/part3.aspx#_Timers) से थ्रेड पर घटनाओं को आग लगा देता है और यूआई थ्रेड पर नहीं। आपका सबसे अच्छा तरीका इस तरह एक फोन के माध्यम से नियंत्रण के डिस्पैचर आह्वान करने के लिए है:

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

     return null; 
    }), null); 
+1

+1 डिस्पैचर टिमर काम नहीं करता है, यह मेरे लिए यह है –

संबंधित मुद्दे