Tuesday, 15 March 2011

.net - C++/CLI WinForms: BeginInvoke Error -


मैं इस त्रुटि का कारण जानने में असमर्थ हूं:

आमंत्रण या आरंभ इन्कॉव नहीं कर सकता

यहां मेरा (छीन लिया गया) कोड है:

  निजी : शून्य माइडिलेगेट का प्रतिनिधि (ऑब्जेक्ट ^ ओपनफ़ाइलडायलोग 1); सूचीदृश्य ^ myDelegate; निजी: शून्य आयात_लिंक (ऑब्जेक्ट ^ ओपनफ़ाइलडायलोग 1) {myDelegate = (जीसीएनयू सिस्टम :: विंडोज :: फॉर्म :: लिस्ट्यूव्यू ()); MyDelegate- & gt; बैंगइनवोक (जीसीएनई मायडिलेगेट (यह, और फॉर्म 1 :: आयात_लिंक्स), ओपनफ़ाइलडायलोग 1); // यहां कुछ काम करते हैं} निजी: सिस्टम :: शून्य आयात_लिंकक्लिकेड (सिस्टम :: ऑब्जेक्ट ^ प्रेषक, सिस्टम :: विंडोज :: फॉर्म :: लिंकलेबेललिंकक्लाइटेडएवेंटअर्ज ^ ई) {ओपनफीलीडायलोग ^ ओपनफाइलडायलोग 1 = जीसीएन्यू ओपनफ़ाइलडायलोग; If (openfileDialog1-> ShowDialog () == सिस्टम :: विंडोज :: फॉर्म :: डायलॉग रिजल्ट :: ओके) {थ्रेड ^ आयात थ्रेड = जीसीएन्यू धागा (जीसीएन्यू पैरामीटरेटेडथाडस्टार्ट (यह, और फॉर्म 1 :: आयात_लिंक्स)); importThread- & gt; प्रारंभ (openFileDialog1); }}  

कृपया मुझे समाधान पता करें।

 < कोड> myDelegate = (जीसीएनयू सिस्टम :: विंडोज :: फॉर्म :: लिस्ट्यूव्यू ());  

इस कथन के साथ मूल समस्याएं:

  • यह कोई प्रतिनिधि नहीं है, यह एक ListView ऑब्जेक्ट है
  • कंट्रोल के पास एक मजबूत सहयोग है धागे के साथ जिस पर उन्हें बनाया जाता है
  • एक नियंत्रण के लिए माता-पिता को दृश्य और उपयोगी बनने की आवश्यकता होती है, इसमें एक नहीं है
  • एक नियंत्रण को थ्रेड की आवश्यकता होती है एक डिस्पैचर लूप चलाएं ताकि संदेश प्राप्त हो सके। इस तरह के थ्रेड को आवेदन करना चाहिए: रन () आपका कार्यकर्ता धागा नहीं करता है
  • नियंत्रण के लिए अंतर्निहित विंडो को आलस रूप से बनाया जाता है, जब दृश्यमान बनने की आवश्यकता होती है चूंकि इसकी कोई अभिभावक नहीं है और वह दृश्यमान नहीं है, इसलिए अभी तक खिड़की बनाने की कोई जरूरत नहीं है। इसलिए इसमें एक वैध हैंडल प्रॉपर्टी नहीं होगी, क्योंकि अपवाद आपको बताता है
  • BeginInvoke () सुनिश्चित करता है कि लागू कोड उस थ्रेड पर चलता है जो नियंत्रण के स्वामी है। चूंकि यह कार्यकर्ता धागा है, जो कि मालिक है, BeginInvoke () वास्तव में किसी दूसरे धागे के लिए कभी भी शामिल नहीं हो सकता है

आप पहले से ही सही धागा के स्वामित्व वाली वस्तु के संदर्भ में हैं यह यह है तो सही कोड ऐसा दिखेगा:

<पूर्व> शून्य आयात_लिंक (ऑब्जेक्ट ^ ओपनफ़ाइलडायलोग 1) {यदि (यह- & gt; इनवोकरूएयर) {यह- & gt; बीविंग इनवोक (जीसीएन्यू मायडिलेगेट (यह, और फॉर्म 1 :: Import_links), openFileDialog1); } अन्य {/} कुछ काम यहाँ है}}

लेकिन अंतिम भ्रम को ध्यान में रखें, आपने एक कार्यकर्ता थ्रेड बनाया है और केवल कोड> इस- & gt; BeginInvoke () । यह माइक्रोसेंड का एक अंश लेता है बहुत कम काम करने के लिए एक धागा बनाना कभी उपयोगी नहीं होता है।

अपने कोड को रिफैक्टर करें, पृष्ठभूमि वर्कर का उपयोग करें अपने डूवर्क इवेंट हैंडलर को केवल ऐसी चीजों की तरह करते हैं जो महंगे हैं, जैसे फ़ाइल आयात करना इसके RunWorkerCompleted ईवेंट को केवल , UI थ्रेड पर होने वाली चीज़ों की तरह करते हैं, जैसे कि आयात के परिणाम प्रदर्शित करने और "मैं उस पर काम कर रहा हूं" सूचना छिपा रहा हूं।


No comments:

Post a Comment