2010-08-24 19 views
5

लौटने के लिए एक लंबा समय ले रहा है। मैं एक सुंदर मानक क्यूटी मोबाइल ऐप (सी ++ में लिखा गया, सिम्बियन उपकरणों पर लक्षित) पर काम कर रहा हूं, और यह पता चला है कि कभी-कभी जब ऐप बंद होता है (यानी कॉल के माध्यम से QAplication :: छोड़ें), ऐप में अंतिम विनाशक को वापस करने में लंबा समय लग सकता है (30 सेकंड प्लस)। इसका मतलब है कि, विनाशक में सभी स्वच्छ संचालन पूरा हो गए हैं (जल्दी से, एक दूसरे के भीतर सभी अच्छी तरह से) और हम उस बिंदु तक पहुंच गए हैं जहां निष्पादन विनाशक को छोड़ रहा है और उस कोड पर लौट रहा है जिसे स्पष्ट रूप से कहा जाता है (यानी जब हम हटाते हैं उदेश्य)।क्यूटी सी ++ विनाशक

स्पष्ट रूप से उस बिंदु पर मैं वस्तु को हटाने के लिए कॉल के ठीक बाद तुरंत निष्पादन की अपेक्षा करता हूं, लेकिन जैसा कि मैंने कभी-कभी कहा है कि यह उम्र ले रहा है!

यह लंबा बंद समय डीबग और रिलीज बिल्ड में होता है, लॉगिंग सक्षम या अक्षम के साथ, इसलिए मुझे नहीं लगता कि यह एक कारक है। जब हम विनाशक के अंत तक पहुंच जाते हैं तो मुझे यकीन है कि कोई फ़ाइल हैंडल खुला नहीं है, या कोई अन्य खुला संसाधन (नेटवर्क कनेक्शन इत्यादि) ... हालांकि भले ही वे निश्चित रूप से यह स्वयं को एक समस्या के रूप में पेश नहीं करेंगे विनाशक से बाहर निकलना (?)।

यह एप्लिकेशन की QMainWindow ऑब्जेक्ट को हटाने पर है। वर्तमान में यह करने के लिए कॉल QAplication :: aboutToQuit से जुड़े स्लॉट में है, हालांकि मैंने उस ऑब्जेक्ट को "मुख्य" फ़ंक्शन में भी हटाने का प्रयास किया है।

हम जो विलंब अनुभव करते हैं, उससे बाहर निकलने से पहले ऐप में गतिविधि की मात्रा के अनुपात में आनुपातिक लगता है। इस तरह के मुझे लगता है कि मेमोरी लीक यहां एक समस्या हो सकती है, हालांकि हमें किसी के बारे में पता नहीं है (इसका मतलब यह नहीं है कि कोई भी नहीं है), और मैंने कभी भी इस व्यवहार को लीक के साथ कभी नहीं देखा है याद।

क्या कोई भी विचार है कि यहां क्या हो रहा है?

चीयर्स

+0

यदि आप डीबगर का उपयोग करते हैं तो क्या आप इस समस्या का अनुभव करते हैं? क्या आप कोड की रेखा को अलग कर सकते हैं जो इतनी देर लेती है? –

+0

हाँ मैं इसे डीबगर में भी देखता हूं। कोड के कौन से सेगमेंट बहुत लंबे समय तक लेते हैं, इस समस्या को विघटनकर्ता से लौटने के दौरान समस्या होती है। तो विनाशक में अंतिम पंक्ति निष्पादन समाप्त हो गई है, हम फिर विनाशक से बाहर निकल रहे हैं, और इस समय देरी होती है। मेरा मानना ​​है कि क्यूटी ढांचा उस बिंदु पर कुछ कर रहा है जो देरी कर रहा है, हालांकि मुझे अभी तक पता नहीं है कि क्या। – busta83

उत्तर

4

तो अपने अंतिम नाशक एक वर्ग से विरासत में QObject तो QObject नाशक तुरंत अपने अंतिम वस्तु का नाशक निम्नलिखित बुलाया जाएगा के लिए है। संभवतः यह वस्तु संभावित रूप से बड़े ऑब्जेक्ट पेड़ की जड़ है जो कई बच्चों को QObjects के विनाशक को बुलाकर कई कार्रवाइयों को ट्रिगर करेगी। चूंकि आप बताते हैं कि समस्या गतिविधि की मात्रा से जुड़ी हुई है, इसलिए इस समय हटाए गए ऑब्जेक्ट पेड़ में बहुत बड़ी संख्या में बच्चों को जोड़ा जा सकता है, शायद आपके इरादे से अधिक। सभी ऑब्जेक्ट्स को एक विशाल पेड़ में एक बार में हटाए जाने के बजाय। ऐसी वस्तुओं की पहचान करें जिन्हें अक्सर बनाया जा रहा है जिन्हें पूरे निष्पादन के माध्यम से जारी रखने की आवश्यकता नहीं है। माता-पिता के साथ उन वस्तुओं को बनाने के बजाय, एक नया पेड़ शुरू करें जिसे पहले हटाया जा सकता है (parent = 0)। QObject :: deleteLater() पर देखें जो तब तक इंतजार करेगा जब तक कि इन स्वतंत्र पेड़ों में वस्तुओं को हटाने के लिए कोई उपयोगकर्ता इंटरैक्शन नहीं होता है।

+0

मैंने कुछ parenting को हटाने और इसके बजाय deleteLater का उपयोग करना शुरू कर दिया है और मैं विनाश समय में उल्लेखनीय सुधार देख रहा हूं। बढ़िया सामान, धन्यवाद! – busta83

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