2010-03-19 105 views
9

पर निशान नहीं लगाएगा मुझे एक अजीब समस्या है ... मैं पिछले कुछ घंटों से अपने दिमाग से बाहर जा रहा हूं ... टाइमर मैंने अपने विनफॉर्म कोड (टूलबार से) में रखा है टिक नहीं होगा ...सी # टाइमर

मेरे पास मेरे कार्यक्रम में दो रूपों पर टाइमर हैं, वे सभी ठीक काम करते हैं ... मैं वही करने की कोशिश करता हूं जो यह टिक नहीं करेगा ... मैं चुनता हूं इसे, इसे एक फॉर्म पर खींचें, इसे सक्षम करें, अंतराल सेट करें और टिक ईवेंट को संभालें ... और कुछ भी नहीं होता ... मैंने मैकबॉक्स जैसे यादृच्छिक कोड डालने का भी प्रयास किया है, यह देखने के लिए कि कुछ भी होता है, और कुछ नहीं!!! जैसा कि मैंने कहा था, मेरे प्रोग्राम में कुछ और टाइमर हैं (अन्य रूपों पर, मैं इस टाइमर को रखने की कोशिश नहीं कर रहा हूं) और वे सभी ठीक काम करते हैं ...

कोई सुझाव?

अग्रिम धन्यवाद!

+2

कुछ कोड में मदद मिलेगी। – Shoban

+0

यह टाइमर के लिए मानक दृश्य स्टूडियो जेनरेट कोड है ... this.timer1 = new System.Windows.Forms.Timer (this.components); निजी सिस्टम। Windows.Forms.Timer टाइमर 1; this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick + = new System.EventHandler (this.timer1_Tick_1); निजी शून्य टाइमर 1_TICK_1 (ऑब्जेक्ट प्रेषक, EventArgs ई) { संदेशबॉक्स। शो ("टाइमर टिक"); } – Andrej

+0

क्या आपने इसे शुरू किया? – Jake

उत्तर

6

बुला timer1.Start()

+1

+1 मुझे लगता है कि बहुत से लोग ऐसा नहीं करते हैं :) –

+1

हाँ, मुझे इसे स्वयं कुछ बार –

+2

द्वारा काट दिया गया है। सक्षम = सत्य पर्याप्त होना चाहिए। –

7

पर .enabled ... वैसे भी .. मैं सिर्फ यह काम करने के लिए मिल गया है नहीं System.Windows.Forms.Timer टाइमर शुरू कर से सुनिश्चित करें कि आप इसे शुरू करें ... मैं कॉपी किया दृश्य स्टूडियो WINFORMNAME.cs लिए कोड के रूप WINFORMNAME.designer.cs generadted ... मुझे पता नहीं कैसे और क्यों, लेकिन यह काम किया ...

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 
     } 
जवाब के लिए

धन्यवाद हर कोई!

9

मुझे पता चला है कि अगर मैं टाइमर को गैर-यूआई थ्रेड से रोकता हूं, तो इसे फिर से शुरू करें, मैं ईवेंट हुक खो देता हूं।

मैं क्या "उचित" जवाब है पता नहीं है, लेकिन यह मेरे लिए काफी अच्छा कार्य: इस दृष्टिकोण को

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

तीन बातें: कंस्ट्रक्टर्स अधिभावी द्वारा

1), मैं सुनिश्चित करें कि आधार टाइमर शुरुआत से सक्षम है।

2) "सक्षम" ओवरराइड करके, मैंने बेस टाइमर को अक्षम नहीं होने दिया, लेकिन इंटरफ़ेस बदल नहीं गया।

3) "ऑनटिक" को ओवरराइड करके, मैंने ओवरराइड सक्षम संपत्ति को यह तय करने दिया कि घटना को आग लगनी चाहिए या नहीं।

प्रारंभ() और रोकें() सक्षम संपत्ति के लिए सही और गलत सेट करके प्रारंभ करें।

बीटीडब्ल्यू - क्या किसी को पता है कि घटना कभी भी आग लगती है (या डिस्कनेक्ट हो जाती है?) जब टाइमर को गैर-यूआई थ्रेड से रोका/अक्षम किया जाता है?

+1

यह मेरे लिए हल हो गया। हमेशा सिस्टम को रोकें/शुरू करें। Windows.Forms.Timer UI थ्रेड पर, स्पष्ट रूप से! – user1454265

+0

यह एक बहुत उपयोगी जवाब था। आपको बहुत - बहुत धन्यवाद ! :) –

2

अपने अंतिम प्रश्न का उत्तर देने के लिए, इसे किसी अन्य थ्रेड पर बनाए गए नियंत्रणों में हेरफेर करने की अनुमति नहीं है। आप प्रतिनिधियों के माध्यम से आह्वान कर सकते हैं।

+0

एक असंबंधित, हालांकि हल समस्या में, मुझे यकीन नहीं था कि मेरा क्यों .how() या .ShowDialog() कॉल काम नहीं कर रहे थे। मैं क्रॉस-थ्रेडेड कॉल कर रहा था। इस कथन ने मुझे इसे समझने में मदद की। धन्यवाद। –

1

मैं इससे पहले इसमें भाग गया हूं। मैं अंतराल सेट करने से पहले टाइमर सक्षम था। चार लाइनों को स्वैप करने से यह काम करता है।

0

मुझे वही समस्या थी जैसे कि मैंने और मैंने वेब पर कई समाधानों की कोशिश की है।

मैं अपने कार्यक्रम (उलटी गिनती) में प्रत्येक प्रपत्र के लिए समय सीमा था और यहाँ मैं यह कैसे हल है:

मैं कंप्यूटर इंजीनियरिंग समाधान का इस्तेमाल किया। इसे बंद करो और फिर से !! :)) मेरा मतलब है कि मुझे नहीं पता क्यों, लेकिन यह काम करता है !!

सबसे पहले मैंने .cs और design से सभी टाइमर हटा दिए, फिर मैंने प्रत्येक फॉर्म में एक टाइमर जोड़ा और टाइमर और टेक्स्ट बॉक्स के लिए अलग-अलग नाम डाला और एक ही कोड को एक-एक करके लिखा।

मैं सिर्फ timer.start इस्तेमाल किया() और 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(); 
     } 
    } 

आशा है कि यह मदद करता है

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