2012-10-25 40 views
5

में अपडेट किया गया है मेरे पास 2 प्रगतिबार और 1 पृष्ठभूमि कार्यकर्ता के साथ एक साधारण रूप है। मेरे पास 2 लूप हैं (एक दूसरे के भीतर) और मैं एक बार बढ़ने के बाद प्रत्येक लूप की प्रगति की रिपोर्ट करना चाहता हूं।केवल 2 में से 2 प्रगति सलाखों को पृष्ठभूमिवर्कर

private void buttonStart_Click(object sender, EventArgs e) 
{ 
    workerCustomers.RunWorkerAsync(); 
} 

private void workerCustomers_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
    progressBar2.Value = (int)e.UserState; 
} 

private void workerCustomers_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int customer = 0; customer < 50; customer++) 
    { 
     int customerPercentage = ++customer * 100/50; 
     workerCustomers.ReportProgress(customerPercentage, 0); 

     for (int location = 0; location < 500; location++) 
     { 
      int locationPercentage = ++location * 100/500; 
      workerCustomers.ReportProgress(customerPercentage, locationPercentage); 
     } 

     workerCustomers.ReportProgress(customerPercentage, 0); 
    } 
} 

जब कार्यक्रम, चलाता है progressbar1 अद्यतन हो जाता है ठीक है, लेकिन progressbar2 कभी नहीं ले जाता है: यहाँ कोड मैं है। अगर मैं इसे डीबगर के माध्यम से चलाता हूं, तो मैं प्रगतिबार 2 के मूल्य को बदल सकता हूं, ग्राफिक रूप से कोई बदलाव नहीं है। कोई विचार?

+0

क्या प्रगति पट्टी का अधिकतम मूल्य ठीक से सेट है? –

+0

@ एलसी।, हां, डिफ़ॉल्ट रूप से, यह 100 पर सेट है लेकिन मैंने इसे दूसरे लूप काउंटर कुल 500 के मिलान के लिए बदल दिया है। – Robert

+1

500 का एक लूप बहुत तेज़ होगा। यह अद्यतन नहीं हो सकता है। एक थ्रेड जोड़ने का प्रयास करें। नींद() को आंतरिक लूप में देखें और देखें कि वास्तव में यह देखने के लिए वास्तव में बहुत तेज़ हो रहा है या नहीं। –

उत्तर

5

हां, यदि आपके डेस्कटॉप पर एरो सक्षम है तो दूसरी प्रगति पट्टी अपडेट करने में विफल रहेगी। जो एनिमेटेड प्रोग्रेस बार प्रदान करता है, जो कि यात्रा हाइलाइट नोट के साथ डिफ़ॉल्ट रूप से हरा होता है।

यह प्रगति बार शैली विशेष है, यह मध्यवर्ती मूल्यों को इंटरपोल करता है और हमेशा चिकनी दिखता है, भले ही आप मूल्य संपत्ति को पाठ्यक्रम मान निर्दिष्ट करते हैं। दूसरे शब्दों में, आप 10, 20, 30, इत्यादि असाइन कर सकते हैं लेकिन बार कूद नहीं है। यह बार लंबाई को सुचारू रूप से बढ़ाता है।

इसका दुष्प्रभाव है। इस एनीमेशन को काम करने के लिए, प्रगति पट्टी अंतराल होना चाहिए। दूसरे शब्दों में, यह हमेशा एक मूल्य दिखा रहा है जो प्रोग्राम किए गए मान के पीछे है। और प्रोग्राम किए गए मान में बार लंबाई को सुचारु रूप से बढ़ाने के लिए कुछ समय बीत जाना चाहिए।

एक और अधिक विस्तार आप जानना चाहते हैं: इस एनीमेशन नहीं हो सकता है जब आप कमी मूल्य संपत्ति है, कि तुरंत बार लंबाई कूदता है।

तो समस्या यह है कि आप वैल्यू प्रॉपर्टी को बहुत उच्च दर पर अपडेट कर रहे हैं, बार की तुलना में बहुत तेज़ हो सकता है। यह कभी पकड़ नहीं सकता है। जब आप 0 पर पुनरारंभ करते हैं, तब भी वह बार को कूदता है।

System.Threading.Thread.Sleep(1); 

तर्क मान के साथ खेलने के लिए, आप बढ़ाना पड़ सकता है: दर इतनी अधिक है कि एनीमेशन इसे करने के लिए 1.

कभी नहीं कर सकते हैं आप आंतरिक पाश अंदर इस बयान डालने से यह देख सकते है किसी भी अंतर को देखने के लिए 16 तक। जितना अधिक आप इसे बनाते हैं, उतना ही बार इसे इंटरपोलेशन द्वारा बनाता है।

यह निश्चित रूप से वास्तविक समस्या नहीं है, ऐसा इसलिए होता है क्योंकि आपका कर्मचारी कोई वास्तविक काम नहीं कर रहा है। जैसे ही आप वास्तविक कोड लिखना शुरू करते हैं, इस बीजीडब्ल्यू को ऐसा करना है, तो आप उस दर को भी कम कर देंगे जिस पर आप प्रोग्रेस चेंजड कहते हैं।

+0

इस विस्तृत उत्तर के लिए धन्यवाद, मैंने बहुत कुछ सीखा। इस मुद्दे के लिए सबसे अच्छा तरीका क्या है? – Robert

+1

मैं उस अंतिम पैराग्राफ के बारे में स्पष्ट था। –

1

समस्या इस तथ्य में निहित है कि आपका आंतरिक पाश इतना तंग है कि गुई अपडेट गुई के लिए सटीक रूप से प्रतिक्रिया देने के लिए अक्सर पोस्ट कर रहे हैं। समाधान आपके असली काम को आंतरिक लूप में जोड़ना है, इसलिए इसमें अधिक समय लगता है या यदि आप जीयूआई अनुकरण करना चाहते हैं, तो आप कुछ समय लेने वाले काम को अनुकरण करने के लिए केवल Thread.Sleep(100) जोड़ सकते हैं।

यह भी सुनिश्चित करें कि आपकी प्रगति पट्टी अधिकतम 100 पर सेट हो, क्योंकि यह अधिकतम मूल्य है जिसे आप प्रत्येक के लिए लौट रहे हैं।

0

आपकी मुख्य समस्या बहुत तेज़ आंतरिक लूप से आती है जिसका अर्थ है कि आप वास्तव में प्रगति को नहीं देख सकते हैं क्योंकि प्रोग्रेसबार को संभालने के लिए अपडेट बहुत तेज़ हैं।

गए कोड का लाइन: जब आप भीतरी पाश खत्म, इसलिए 500 करने के लिए सेट है कि संख्या के लिए अच्छी तरह से संबंधित नहीं है प्रगतिबार अधिकतम मूल्य होने

location * 100/500 

100 के बराबर होगा। इसका मतलब है कि आपकी प्रगति पट्टी अधिकतम मूल्य तक कभी नहीं पहुंच जाएगी।