2009-04-10 18 views
10

में वीबीए + थ्रेड एमएस एक्सेस वीबीए में एक अलग धागे पर चल रही प्रक्रिया कैसे बना सकते हैं? मैं एक ऐसी प्रक्रिया बनाना चाहूंगा जो बस बैठे और एक संदेश की प्रतीक्षा करेगी।एमएस एक्सेस

उत्तर

3

अच्छा सवाल है, लेकिन मुझे लगता है कि यह नहीं किया जा सकता है।

+2

+1 है। आप एक बहुप्रचारित घटक (या मौजूदा एक का उपयोग कर सकते हैं) लिख सकते हैं और इसे वीबीए से कॉल कर सकते हैं, लेकिन वीबीए स्वयं बहुसंख्यक नहीं है। – Joe

0

एक ऐसा फॉर्म बनाने का सबसे तेज़ तरीका है जिसे आप एक फॉर्म बनाना चाहते हैं और उस पर मौजूदा या स्वयं नियंत्रण कर सकते हैं।

4

इसे सीधे वीबीए में करने का कोई तरीका नहीं है। Here is a MSDN forum discussion इस बारे में विस्तार से बात कर रहे हैं। मल्टीथ्रेडिंग के लिए कार्यालय ने कभी भी वीबीए एक्सटेंशन का खुलासा नहीं किया।

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

इसके अलावा, आप COM थ्रेडिंग पर बेंडवेई लिंक को देखना चाह सकते हैं, क्योंकि यह इसके लिए बहुत प्रासंगिक है।

-1

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

+5

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

+0

रीड, मुझे यकीन है कि यह वीबी 6 के लिए सच है। क्या यह वीबीए के लिए अलग है? – andrewrk

+0

नहीं, यह उसी थ्रेड पर निष्पादित किया गया है – Onkelborg

1

शेल स्क्रिप्ट शुरू करने के लिए ShellOpen() जैसे कुछ का उपयोग करने के बारे में कैसे, उदाहरण के लिए Visual Basic Script x times, जो काम करेगा, एक फ़ाइल के माध्यम से स्क्रिप्ट के साथ संचार कर रहा है (और परिणाम आने पर पता लगाने के लिए पूलिंग तंत्र)? मुझे लगता है कि एक COM घटक लिखने से करना आसान है। इसके अलावा, वीबी स्क्रिप्ट वीबीए के समान ही है। खराब पक्ष काफी कुछ हैं, हालांकि - फ़ाइल को लिखना और पढ़ना स्मृति साझा करने से ज्यादा समय ले रहा है, पूलिंग वीबीए स्क्रिप्ट को उत्तरदायी नहीं लग सकती है, आदि

-1

आप DoEvents प्रक्रिया का भी उपयोग कर सकते हैं जो सिस्टम को संभालने देता है आयोजन। समय-समय पर इस सब को कॉल करें और मुख्य धागा शोज़ न करें।

+4

यह एक अच्छा समाधान नहीं है, यह बुरा है, वास्तव में बुरा है – Onkelborg

+0

और ऐसा बुरा समाधान क्यों है? मैंने अपनी स्क्रिप्ट में इस दृष्टिकोण का उपयोग किया है और यह अच्छा काम करता है। मैंने 1000 एमएस या एक सेकेंड के अंतराल पर डोवेन्ट्स को बुलाया। – Ionut

+0

अच्छा, यह काम किया, लेकिन यह है। एक इंटरफ़ेस जो प्रति सेकंड एक बार संदेशों का जवाब देता है वह उत्तरदायी नहीं है। और सिर्फ मतदान के लिए प्रोग्राम निष्पादित कोड रखना बुरा व्यवहार है। कुछ भी नहीं होने पर कार्यक्रम को सोने के लिए धक्का देना बेहतर होता है। इस कारण से अन्य कार्यक्रम लाभ कम संदर्भ स्विच हो रहे हैं, और बिजली की खपत कम हो जाती है। यदि आपको वास्तव में, वास्तव में मतदान करना है, तो DoEvents- दृष्टिकोण का उपयोग न करें, कम से कम एक टाइमर का उपयोग करें, यह आपके संदेश कतार को गड़बड़ नहीं करेगा और आपके आवेदन को उत्तरदायी नहीं बनायेगा – Onkelborg

4

आप इस समाधान की जाँच करने के लिए चाहते हो सकता है: http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html

यह एक्सेल है, लेकिन यह व्यावहारिक रूप से ही होना चाहिए। सही: यह VBScript "एजेंट" का निर्माण और उन्हें .. कार्यों को अंजाम उदाहरण चेक राशि से काम करता है, यह काफी प्रभावशाली

-Viggo

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