2009-07-23 17 views
14

मैं एक Winform में एक बार एक बार टिकने के लिए टाइमर प्राप्त करने की कोशिश कर रहा हूं, जब मैं इस बारे में सलाह लेता हूं कि मुझे थ्रेड के बारे में सामान मिलते हैं। खैर मुझे धागे की परवाह नहीं है, क्योंकि मैं बस इतना करने की कोशिश कर रहा हूं कि एक मिनट में 60 से 0 के बीच मूल्य गिनती हो, तो रुको। मुझे नहीं लगता कि हमें इसे हल करने के लिए क्लाउड कंप्यूटिंग में जाना होगा, लेकिन मैं वास्तव में एक वेब फॉर्म हूं, इसलिए मैं इस मुद्दे पर थोड़ी सी जंगली हूं। किसी को भी एक उदाहरणडमीज़ के लिए Winforms टाइमर

करने के लिए मुझसे बात कर सकते हैं यहाँ मैं क्या करने की कोशिश की

private void button1_Click(object sender, EventArgs e) 
    { 
     this.timeLeft = 60; 
     this.label1.Visible = false; 
     this.button1.Visible = false; 
     gt = new Timer(); 
     gt.Tick += new EventHandler(CountDown); 
     gt.Interval = 1000; 
     gt.Start(); 
    } 

private void CountDown(object sender, EventArgs e) 
{ 
    do 
    { 
     this.TimeBar.Value = timeLeft;     
     this.timeLeft -= 1; 
    } while (this.timeLeft > 0); 
    if (this.TimeBar.Value > 0) return; 
    gt.Stop(); 
    this.label1.Visible = true; 
    this.button1.Visible = true; 
} 

किसी भी मदद की सराहना की होगी।

उत्तर

8

क्या हो रहा है यह है कि आप टाइमर के पहले ट्रैक पर शून्य तक पहुंचने तक timeLeft परिवर्तनीय को कम कर रहे हैं। do...while पाश बाहर निकालें और आपके पास मूल रूप से काम करने वाला उदाहरण होगा।

हालांकि यदि आप किसी भी प्रकार के विंडोज फॉर्म काम करने जा रहे हैं, तो आपको थ्रेडिंग के बारे में सीखना होगा और यह यूआई को कैसे प्रभावित करेगा। यदि आप अनुपयोगी अपवादों और UI घटकों को गलत व्यवहार करने की कहानियों के साथ नहीं हैं, तो आप बहुत जल्दी यहां वापस आ जाएंगे। जॉन स्कीट का उत्कृष्ट threading series है। मैं इसकी पुरजोर सलाह देता हूँ। इसमें टाइमर को समर्पित एक अनुभाग है, जिससे आपको कुछ अतिरिक्त अंतर्दृष्टि मिल सकती है।

+0

और उलटी गिनती समाप्त होने के बाद टाइमर को अक्षम करना न भूलें, अन्यथा आप नकारात्मक संख्या में भाग लेंगे। –

+0

धन्यवाद, यह काफी देर हो चुकी है, बेशक मुझे लूप की जरूरत नहीं है, दोह! श्री स्कीट के थ्रेडिंग दस्तावेज़ों के लिंक के लिए भी धन्यवाद। :) –

+0

@Martinho - Obligado, हाँ कि मुझे भी मिला है :) –

8

अगर आप Winforms 'टाइमर का उपयोग करते हैं तो थ्रेडिंग की आवश्यकता नहीं है।

अपने पृष्ठ पर नाम यह "टाइमर" एक टाइमर नियंत्रण ड्रॉप, और पेस्ट निम्नलिखित कोड:

public MainForm() 
{ 
    InitializeComponent(); 

    timer.Interval = 1000; 
    timer.Start(); 

    timeLeft = 60; 
    timer.Tick += Timer_Tick; 

    // start things 
    label1.Hide(); 
    button1.Hide(); 
    timer.Start(); 

} 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    timeLeft--; 

    if (timeLeft <= 0) { 
     timer.Stop(); 
     label1.Show(); 
     button1.Show(); 
    } 
} 

मुझे लगता है कि यदि आप एक वेबी पृष्ठभूमि से आए हैं, घटनाक्रम चालित प्रोग्रामिंग शायद बात है अगर आप समझना चाहते हैं कि डेस्कटॉप पर सामान कैसे प्रोग्राम किए जाते हैं, तो आपको पढ़ने के बारे में पढ़ना शुरू करना होगा।

+0

धन्यवाद, हाँ थ्रेडिंग चीज सिर्फ शोर थी, मुझे अब इसे हल किया गया है, लेकिन मुझे कुछ अच्छे पठन पॉइंटर्स भी मिल गए हैं। –

2

आप अपने ईवेंट हैंडलर में कोई लूपिंग नहीं करना चाहते हैं। हैंडलर को एक बार प्रति टाइमर 'टिक' कहा जाता है - प्रत्येक 1000 मिलीसेकंड, जैसा कि आपने इसे कॉन्फ़िगर किया है। तो आप प्रति कॉल एक बार अपने timeLeft चर को कम करना चाहते हैं, फिर timeLeft शून्य हिट करते समय पूरी चीज़ को बंद करें।

// untested 
private void CountDown(object sender, EventArgs e) 
{ 
    this.TimeBar.Value = timeLeft; 
    this.timeLeft--; 
    if (this.TimeBar.Value == 0) 
    { 
     gt.Stop(); 
     this.label1.Visible = true; 
     this.button1.Visible = true; 
    } 
} 
+0

धन्यवाद, यहां खराब टीवी के कारण, मेरी बेटी के उपयोग के लिए एक छोटी सी परियोजना कर रही है, बस थोड़ा सा मस्तिष्क फीका था। आपका कोड काफी कुछ है जो मैंने समाप्त किया था। –

3

अलावा (jasonh के जवाब के अनुसार) पाश बाहर ले जाने से, अपने दृष्टिकोण एक छोटे से गलत हो सकता है अगर एप्लिकेशन तरह का व्यस्त है। यद्यपि आप मिलीसेकंड में अपना अंतराल निर्दिष्ट करते हैं, WinForms टाइमर के पास 18 एमएस रिज़ॉल्यूशन है और इसकी बहुत कम प्राथमिकता है, संदेश लूप केवल टाइमर की जांच करता है अगर उसे कुछ और करने के लिए नहीं मिलता है।

तो, स्टार्टटाइम (डेटटाइम) मान रखें और प्रत्येक टाइमर ईवेंट में शेष समय की गणना करने के लिए इसका उपयोग करें। आपको बस एक मिनट तक पहुंचने के लिए 61 टिक की आवश्यकता हो सकती है।

+0

हाँ, टाइमर पढ़ने वाले लगभग 55 एमएमएस के लिए सटीक है। यह केवल कुछ ही मामूली कर रहा है, इसलिए एक मिनट में + -3 सेकंड होगा, अन्य प्रक्रियाएं बैंक को तोड़ नहीं देंगे। हालांकि धन्यवाद :) –

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