वीबी 6 में एसिंक्रोनस पृष्ठभूमि प्रसंस्करण के लिए यहां एक सुंदर मानक योजना है। (उदाहरण के लिए यह डैन ऐप्पलमैन के book और माइक्रोसॉफ्ट के वीबी 6 samples में है।) आप काम करने के लिए एक अलग ActiveX EXE बनाते हैं: इस तरह काम एक अलग प्रक्रिया में स्वचालित रूप से किसी अन्य थ्रेड पर होता है (जिसका अर्थ है कि आपको चिंता करने की ज़रूरत नहीं है चर को तंग कर दिया जा रहा है)।
- वीबी 6 ActiveX EXE ऑब्जेक्ट को किसी ईवेंट को चेकक्यूइट डूस्टफ() का खुलासा करना चाहिए। यह एक ByRef बूलियन को छोड़ दिया जाता है।
- क्लाइंट ActiveX EXE ऑब्जेक्ट में StartDoStuff को कॉल करता है। यह दिनचर्या एक छिपे हुए फॉर्म पर टाइमर शुरू करती है और तुरंत लौटाती है। यह कॉलिंग थ्रेड unblocks। टाइमर अंतराल बहुत छोटा है इसलिए टाइमर घटना जल्दी से आग लगती है।
- टाइमर इवेंट हैंडलर टाइमर को अक्षम करता है, और उसके बाद ActiveX ऑब्जेक्ट DoStuff विधि में वापस कॉल करता है। यह लंबी प्रसंस्करण शुरू होता है।
- समय-समय पर DoStuff विधि CheckQuitDoStuff ईवेंट उठाती है। क्लाइंट का इवेंट हैंडलर विशेष ध्वज की जांच करता है और अगर इसे निरस्त करना आवश्यक है तो सेट छोड़ें। फिर DoStuff गणना बंद कर देता है और अगर सही हो तो जल्दी से लौटता है।
इस योजना का अर्थ है कि क्लाइंट को वास्तव में बहु-थ्रेडेड होने की आवश्यकता नहीं है, क्योंकि कॉलिंग थ्रेड ब्लॉक नहीं होता है जबकि "DoStuff" हो रहा है। मुश्किल हिस्सा यह सुनिश्चित कर रहा है कि DoStuff घटनाओं को उचित अंतराल पर उठाता है - बहुत लंबा, और जब आप चाहें तो छोड़ नहीं सकते: बहुत छोटा, और आप DoStuff को अनावश्यक रूप से धीमा कर रहे हैं। साथ ही, जब DoStuff निकलता है, तो उसे छिपे हुए फॉर्म को अनलोड करना होगा।
यदि DoStuff वास्तव में निरस्त होने से पहले किए गए सभी सामानों को प्राप्त करने में कामयाब होता है, तो आप क्लाइंट को यह बताने के लिए एक अलग घटना उठा सकते हैं कि काम समाप्त हो गया है।
वह वीबी 6 है, vb.net नहीं। – GSerg
मुझे लगता है कि आप डाउनवॉटेड थे क्योंकि आपने कहा था कि वह "एक अलग थ्रेड का उपयोग करना बेहतर होगा"। – MusiGenesis
सहमत, और तय। – TheSoftwareJedi