दिलचस्प पोस्ट
क्या टीएलएस 1.2 के एनटीटी कार्यान्वयन हैं? सी # में .eml फ़ाइलों को पार्स करने की अनुशंसाएं माइक्रोसॉफ्ट एक्सेल में डार्कट्रिक्स को सीसीवी फाइलों में जोड़ता है? इकाई फ़्रेमवर्क कोड का उपयोग करते हुए एक से एक वैकल्पिक संबंध फ़ॉर्म पर डिफ़ॉल्ट रोकें मैं mod_rewrite में एक निर्देशिका को कैसे अनदेखा कर सकता हूँ? एक स्ट्रिंग में stdout / stderr अनुप्रेषित करें Jquery में बटन पाठ टॉगल एक निर्देशिका की निगरानी के लिए FileSystemWatcher का उपयोग करना स्वत: पूर्ण पाठकदृश्य CursorLoader द्वारा समर्थित स्विफ्ट पर URL से छवि को लोड करना / डाउनलोड करना मैं जीसीसी को एक फ़ंक्शन को इनलाइन करने के लिए कैसे बता सकता हूं? ASP.NET WebAPI में एक फ़ाइल (FileContentResult) को वापस कैसे करें नाम मान के बजाय कक्षा का उपयोग करके jQuery के सत्यापन सी # में FindTimeZoneById () के साथ उपयोग करने के लिए टाइमज़ोन आईडी की सूची?

VB.NET प्रगति पट्टी पृष्ठभूमिकार

जब मेरा एप्लीकेशन शुरू हो जाता है, और इसे अभी अपग्रेड कर दिया गया है, तो मैं एक स्थानीय डेटाबेस अपडेट (SQLite) कर रहा हूं।

यह ऐसा है: उपयोगकर्ता मेरे ऐप को प्रारंभ करता है, और फिर मैं अपग्रेड प्रक्रिया शुरू करता हूं। इस अपग्रेड प्रक्रिया के दौरान मैं एक ऐसा प्रपत्र दिखा रहा हूँ जिसमें एक सतत प्रगति पट्टी है। यह प्रपत्र बंद हो जाता है जब अपग्रेड प्रक्रिया की जाती है और उपयोगकर्ता तब से मेरे आवेदन का उपयोग शुरू कर सकता है।

लेकिन उन्नयन प्रक्रिया बहुत गहन है, क्योंकि प्रगति पट्टी चेतन नहीं होगा

मेरे पुराने VB6 संस्करण में मैंने एक ActiveX-Exe का उपयोग किया है जिसमें 1 फ़ॉर्म है और एक प्रगति पट्टी दिखाता है। यह मेरा "पृष्ठभूमि कार्यकर्ता" था

मुझे यकीन नहीं है कि मैं वीबी.नेट में उसी दृष्टिकोण का उपयोग कर सकता हूं।

मैंने केवल उदाहरणों को देखा है, फिर पृष्ठभूमि के कार्यकर्ता में काम करते हैं, लेकिन मैंने उन उदाहरणों को नहीं देखा है, जहां प्रगति पट्टी स्वयं पृष्ठभूमि कार्यकर्ता भी थी।

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

आपका बहुत बहुत धन्यवाद!

वेब के समाधान से एकत्रित समाधान "VB.NET प्रगति पट्टी पृष्ठभूमिकार"

पहले यह पढ़ें: Application.DoEvents का उपयोग ()

तो ऊपर दिए गए उत्तर को पढ़ने के बाद आप कभी भी दोईवें का उपयोग कभी नहीं करेंगे, और DoEvents (और / या प्रगति के अवैध होने के कारण इसके पेंट इवेंट में आग लग जाएगी) बिना "उन्नयन प्रक्रिया इतनी गहन है क्योंकि" प्रगति पट्टी चेतन नहीं होगा "

इसलिए चुथु की टिप्पणी – "आप एक प्रगति पट्टी के साथ एक संवाद बना सकते हैं, उस डायलॉग मॉडल को बना सकते हैं और एक पृष्ठभूमिवर्कर पर अपना डीबी-सामान निष्पादित कर सकते हैं।" आगे बढ़ने का सबसे अच्छा तरीका है।

मैंने इसके उपयोग के एक सी # कार्यान्वयन का अनुवाद किया है, आप इसे सीधे में ड्रॉप करने में सक्षम होना चाहिए।

यह प्रगति बरार प्रपत्र है:

 Public Partial Class ThinkingProgressBar Inherits Form Private startTime As System.DateTime = DateTime.Now Public Sub New() InitializeComponent() End Sub Private Sub lblClose_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Me.Tag = "Cancelled" Me.Hide() End Sub Public Sub SetThinkingBar(ByVal switchedOn As Boolean) If switchedOn Then lblTime.Text = "0:00:00" startTime = DateTime.Now Timer1.Enabled = True Timer1.Start() Else Timer1.Enabled = False Timer1.Stop() End If End Sub Private Sub timer1_Tick(sender As Object, e As EventArgs) Dim diff As New TimeSpan() diff = DateTime.Now.Subtract(startTime) lblTime.Text = diff.Hours & ":" & diff.Minutes.ToString("00") & ":" & diff.Seconds.ToString("00") lblTime.Invalidate() End Sub End Class 

फ़ॉर्म पर पृष्ठभूमिवर्कर नियंत्रण खींचें / छोड़ें, यहां पृष्ठभूमि कार्यकर्ता इवेंट हैं:

 Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork e.Result = e.Argument 'DirectCast(e.Result, ThinkingProgressBar).SetThinkingBar(True) 'DO LONG OPERATION HERE End Sub Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted Dim dlg As ThinkingProgressBar = TryCast(e.Result, ThinkingProgressBar) If IsNothing(dlg) = False Then dlg.SetThinkingBar(False) dlg.Close() End If End Sub 

और जब आपका आवेदन शुरू होता है और उन्नयन करता है तो यहां कॉलिंग कोड होता है:

 Dim dlg As New ThinkingProgressBar() dlg.SetThinkingBar(True) BackgroundWorker1.RunWorkerAsync(dlg) dlg.ShowDialog() If IsNothing(dlg.Tag) = False AndAlso dlg.Tag.ToString() = "Cancelled" Then Return End If 

कुछ चीजें हैं, आप उपयोगकर्ता को रद्द करने से रोका जा सकता है (यानी lblClose_LinkClicked ) और ऐसे मामलों को सुरक्षित रखने के लिए सुरक्षात्मक / रक्षात्मक प्रोग्रामिंग डालते हैं जहां उपयोगकर्ता प्रक्रिया को मारता है या अपग्रेड के दौरान अपने पीसी को बंद कर देता है।

और प्रगतिबैर वास्तव में एक एनिमेटेड जीआईएफ है – और यह आपके उपयोग के अनुरूप होगा क्योंकि एक डाटाबेस को अपडेट करने का अनुमान लगाते समय अनुमान लगाने में बहुत मुश्किल है:

यहां छवि विवरण दर्ज करें

आपकी आवश्यकताओं से मुझे लगता है कि आप इसके लिए देख रहे हैं:

 Application.DoAction() 

मैंने एक आवेदन में अनुभव किया है कि एक्सएमएल से 2000 से 3000 वस्तुओं के विवरण को लोड करने की आवश्यकता थी और कार्यान्वित प्रक्रिया उन सभी चीजों को पढ़ रही थी जो प्रक्रिया को लटक गई थी। लूप में उपरोक्त पंक्ति का उपयोग करके मेरी समस्या हल हो गई है UI लटका नहीं था और उपयोगकर्ता अन्य रूपों पर काम करने में सक्षम था। यह progressbar is now as background process पट्टी प्रकट हुई progressbar is now as background process मुझे progressbar is now as background process (कुछ हद तक) के रूप में है

आशा करता हूँ की ये काम करेगा!

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

मुझे इस प्रक्रिया का सुझाव दें:

  1. अपने फार्म का उल्लेख प्रगति पट्टी के साथ दिखाएं।

  2. अगर आप किसी अन्य रूप को दिखाते हैं, तो सभी बच्चे के नियंत्रण को अक्षम करें, जो सीधे फॉर्म पर होते हैं। नियंत्रण के आधार पर, आपको उन्हें अक्षम करने के लिए अपने बच्चे के नियंत्रण के माध्यम से चलना पड़ सकता है

  3. कोड में जो डेटाबेस अपडेट करता है, उस प्रगति पट्टी के मूल्य को अपडेट करें, जो आप की इच्छा करते हैं। मूल्य को अद्यतन करने पर, प्रगति पट्टी की रीफ्रेश विधि को कॉल करें। यह प्रगति पट्टी को सही तरीके से पेंट करने के लिए बाध्य करेगा।

  4. एक बार आपका अद्यतन पूरा हो जाने पर, प्रगति पट्टी को छिपाना, सभी रूपों पर सभी नियंत्रणों को पुनः सक्षम करें जिन्हें आपने अक्षम किया था।

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

यह परीक्षण नहीं किया जाता है लेकिन मुझे याद है कि ऐसा कुछ बीजीडब्ल्यू को सूचना देने के लिए किया जाता है। कौन पृष्ठभूमि कार्यकर्ता सामग्री को अद्यतन करेगा।

पहले निम्न चर के साथ एक वर्ग (यानी ProgExample) बनाएं और इसे एक वैश्विक ऑब्जेक्ट के रूप में रखें।

 Dim ProgValue as Integer; Dim ProgMax as Integer; 

फिर कक्षा को पृष्ठभूमि कार्यकर्ता को फ़ीड करें।

 BackgroundWorker1.RunWorkerAsync(_ProgExample) 

इसे पढ़ें और इसे अंदर रखें:

 Dim BGWProgExample as ProgExample = DirectCast(e.Argument, ProgExample), 

पृष्ठभूमि कार्यकर्ता में निम्नलिखित कुछ करें:

 BGWProgressBar.Maximum = BGWProgExample.ProgMax while BGWProgExample.ProgValue <> BGWProgExample.ProgMax BGWProgressBar.Value = BGWProgExample.ProgValue 

तो जब आप कुछ किया है तो बस _ProgExample.ProgValue अद्यतन करें ऐसा करने के लिए तर्क के रूप में ProgValue बस से एक वर्ग के बिना ऐसा करने की कोशिश मत करो। इसका मतलब यह होगा कि आप अपने वर्तमान स्थिति में ProgValue की एक प्रति भेजते हैं और यदि आप ProgValue अद्यतन करना चाहते हैं तो यह परिवर्तित नहीं होगा और अगर यह कुछ भी नहीं करता है तो आवेदन को आज़माएं। ड्यूइवेंट्स और / या एप्लिकेशन। डॉकएक्शन इस के साथ एक साथ।

शायद मैं इस सवाल को समझ नहीं पा रहा हूं, लेकिन यह वास्तव में सरल नहीं है?

 For i = ProgressBar1.Minimum To ProgressBar1.Maximum ProgressBar1.Value = i ProgressBar1.Update() System.Threading.Thread.Sleep(25) Next 

प्रगति पट्टी का "अद्यतन" चाल है आपका कोड "ब्लॉकों" (हालांकि मैं नहीं देख सकता, क्यों नहीं "एप्लिकेशन जवाब नहीं दे रहा है"), लेकिन प्रगतिबार को अपडेट हो जाता है d।

बीटीडब्ल्यू: विंडोज विस्टा / 7 (प्रॉपरबार एनीमेशन) के लिए आप इसकी जांच कर सकते हैं: प्रोग्रेसबार विंडोज फॉर्म में धीमा है

आप पृष्ठभूमि कार्यकर्ता में कोई ईवेंट बढ़ा सकते हैं और फिर UI थ्रेड पर प्रगति बार अपडेट कर सकते हैं। आप अपनी कक्षा में घटनाएं बढ़ा सकते हैं और उन्हें रूप में संभाल सकते हैं। जब वे उठाए जाते हैं, तो आप पृष्ठभूमि कार्यकर्ता पर रिपोर्ट की प्रगति () कॉल कर सकते हैं।

कुछ और जानकारी:

मुख्य थ्रेड को अवरुद्ध किए बिना लंबे समय से चलने वाले UI परिवर्तन करना