2008-10-21 17 views
51

हम इस त्रुटि को Winform एप्लिकेशन में देख रहे हैं। क्या कोई इस समस्या को देखने में मदद कर सकता है, और इससे भी महत्वपूर्ण बात यह है कि इसे कैसे ठीक किया जाए या इसे होने से बचें।विनफॉर्म समस्या - विंडो हैंडल बनाने में त्रुटि

 
System.ComponentModel.Win32Exception: Error creating window handle. 
    at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 
    at System.Windows.Forms.Control.CreateHandle() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) 
    at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) 

उत्तर

42

क्या आपने जीडीआई ऑब्जेक्ट्स, हैंडल, थ्रेड और यूजर ऑब्जेक्ट्स को देखने के लिए प्रोसेस एक्सप्लोरर या विंडोज टास्क मैनेजर चलाया है? यदि नहीं, तो उन कॉलम को देखने के लिए चुनें (कार्य प्रबंधक देखें-> कॉलम का चयन करें ... फिर अपना ऐप चलाएं और उस ऐप के लिए उन कॉलम पर नज़र डालें और देखें कि उनमें से एक वास्तव में बड़ा हो रहा है या नहीं।

यह हो सकता है कि आप UI घटक आपको लगता है कि साफ हो जाने मिल गया है लेकिन निपटारा नहीं किया गया है।

यह है कि उपयोगी हो सकता है के बारे में Here's a link

गुड लक!

+1

मैं इस समस्या में भाग गया और पाया कि मेरे ऐप ने 9600+ यूजर ऑब्जेक्ट्स और 1800+ जीडीआई ऑब्जेक्ट की सूचना दी है। मेरी समस्या यह है कि मैं कुछ भी गलत नहीं कर रहा हूं, मैं सिर्फ फ्लोलाउटआउट पैनल में बहुत सारी चीज़ें जोड़ रहा हूं। मुझे लगता है कि मुझे प्रदर्शित डेटा 'पेज' करना होगा ... –

1

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

+0

पर ध्यान केंद्रित करने के लिए किसी भी चीज है। । । – leora

-1

बाहर स्मृति सुझाव का बुरा नेतृत्व की तरह प्रतीत नहीं होता है।

आपका प्रोग्राम क्या कर रहा है कि यह त्रुटि प्राप्त हो?

क्या यह बहुत सारी खिड़कियां या नियंत्रण बना रहा है? क्या यह उन्हें डिजाइन समय पर विरोध के रूप में प्रोग्रामेटिक रूप से बनाता है? यदि हां, तो क्या आप इसे लूप में करते हैं? क्या वह लूप अनंत है? क्या आप किसी अन्य तरीके से स्मृति की चौंकाने वाली बोतलबंद खपत कर रहे हैं?

जब आप कार्य प्रबंधक में अपने आवेदन द्वारा उपयोग की गई मेमोरी देखते हैं तो क्या होता है? क्या यह चंद्रमा को उछालता है? या बेहतर अभी तक, विवरण प्रक्रिया में मॉनिटर के ऊपर उपयोग करने के लिए सुझाव दिया गया है।

21

आपके आवेदन के लिए विंडोज हैंडल सीमा 10,000 हैंडल है। आपको त्रुटि मिल रही है क्योंकि आपका प्रोग्राम बहुत अधिक हैंडल बना रहा है। आपको स्मृति रिसाव मिलनी होगी। जैसा कि अन्य उपयोगकर्ताओं ने सुझाव दिया है, एक मेमोरी प्रोफाइलर का उपयोग करें। मैं नेट मेमोरी प्रोफाइलर का भी उपयोग करता हूं। साथ ही, सुनिश्चित करें कि आप नियंत्रण पर निपटान विधि को कॉल कर रहे हैं यदि आप से से पहले फॉर्म को बंद कर रहे हैं (अन्यथा नियंत्रण निपटान नहीं करेंगे)। आपको यह भी सुनिश्चित करना होगा कि नियंत्रण में कोई घटना पंजीकृत नहीं है। मेरे पास एक ही समस्या है, और जो भी मुझे पहले से पता है, उसके बावजूद, मुझे अभी भी कुछ स्मृति रिसाव है जो मुझे दूर करना जारी रखता है ..

0

मुझे अपने आवेदन में एक ही त्रुटि मिली। मैं एक ही पृष्ठ में कई नियंत्रण लोड कर रहा हूं। बटन पर क्लिक करें, मैं नियंत्रण को साफ़ कर रहा हूं। नियंत्रण को नियंत्रित करने से स्मृति से नियंत्रण जारी नहीं होता है। इसलिए स्मृति से नियंत्रण का निपटान करें। मैंने अभी controls.clear() विधि पर टिप्पणी की है और नियंत्रणों का निपटान करने के लिए कोड की कुछ पंक्तियां शामिल हैं। controlcollection में कुछ इस

नियंत्रण के रूप में प्रत्येक सीटीएल के लिए

तरह

सीटीएल।निपटान()

अगला

5

यह समस्या लगभग हमेशा GDI वस्तु गिनती से संबंधित है, उपयोगकर्ता ऑब्जेक्ट गिनती या हैंडल गिनती और आमतौर पर आपकी मशीन पर एक आउट-ऑफ-स्मृति हालत की वजह से नहीं

जब मैं इनमें से किसी एक बग को ट्रैक कर रहा हूं, तो मैं ProcessExplorer खोलता हूं और इन कॉलम को देखता हूं: हैंडल, थ्रेड, जीडीआई ऑब्जेक्ट्स, यूजर ऑब्जेक्ट्स, प्राइवेट बाइट्स, वर्चुअल साइज और वर्किंग सेट।

(मेरे अनुभव में, समस्या आम तौर पर एक ईवेंट हैंडलर वस्तु पकड़े और निपटारा किया जा रहा से रोकता है की वजह से एक वस्तु रिसाव है।)

2

ठीक है, मेरे मामले में यह निश्चित रूप से उपयोगकर्ता वस्तुओं है कि बाहर थे नियंत्रण का मैंने विंडोज टास्क मैनेजर में देखा और यकीन है कि, यूजर ऑब्जेक्ट्स गिनती बिल्कुल 10'000 थी।

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

एनबी: डेल्फी में, सभी नियंत्रणों में एक मालिक और एक अभिभावक संपत्ति थी। भले ही किसी ने नियंत्रण की मूल संपत्ति को बदल दिया हो, फिर भी उसका स्वामित्व नियंत्रण तब खत्म हो जाएगा जब स्वामित्व नियंत्रण नष्ट हो जाए।

सी # ऐसा लगता है कि अगर एक नियंत्रण उदा। पैनल को बदलकर एक टैब पेज पर एक फॉर्म को प्रोग्रामेटिक रूप से फिर से सौंप दिया गया है। फॉर्म पर निपटान() को कॉल करने वाली मूल संपत्ति पैनल को डिस्प्ले नहीं करेगी, न ही टैब पेज पर Controls.Clear() को कॉल करेगा। यहां तक ​​कि एक प्रत्यक्ष कॉल पैनल भी।() वास्तव में इसका निपटान नहीं करेगा, जब तक कि इसके माता-पिता को मैन्युअल रूप से पहले से शून्य पर सेट नहीं किया जाता है।

1

मैं एक चेक यह काम करता है कि ...

if (_form.Handle.ToInt32() > 0) 
{ 
    _form.Invoke(method, args); 
} 

यह हमेशा सच है जोड़ा है, लेकिन रूप फेंकता इसके बिना एक त्रुटि। बीटीडब्ल्यू, मेरा हैंडल लगभग 4.9 मिलियन

+0

ध्यान दें कि हैंडल प्रॉपर्टी का कार्यान्वयन यह देखने के लिए करता है कि हैंडल बनाया गया है या नहीं, और यदि नहीं, तो इसे बनाता है। .NET स्रोत कोड में देख रहे हैं: 'सार्वजनिक IntPtr हैंडल {get {... अगर (! This.IsHandleCreated) {this.CreateHandle(); } ...}} '' हैहैंडलक्रेटेड 'संपत्ति आपको हैंडल बनाये बिना सच/गलत लौटाएगी। –

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