2009-11-24 15 views
9

मैं वास्तव में दो प्रश्न पूछना चाहते हैं, लेकिन वे एक तरह से तो यहां से संबंधित हैं वे एक के रूप में जाना ...लेज़ी और आस्थगित TreeViewer सवाल

पेड़ नोड्स है कि वर्तमान में TreeViewer का उपयोग कर प्रदर्शित नहीं होते हैं की कचरा संग्रहण सुनिश्चित करने के लिए कैसे (SWT.VIRTUAL) और ILazeTreeContentProvider? यदि किसी नोड में 5000 बच्चे हैं, तो दर्शक द्वारा प्रदर्शित किए जाने के बाद उन्हें कभी भी जाने नहीं दिया जाता है, इसलिए मेमोरी त्रुटि से बाहर अगर आपके पेड़ में नोड्स और पत्ते की बड़ी संख्या है और पर्याप्त ढेर आकार नहीं है। क्या स्मृति की रिसाव से बचने के लिए कुछ प्रकार का सबसे अच्छा अभ्यास है, जिसके कारण डेटा की बड़ी मात्रा (हजारों वस्तुओं या यहां तक ​​कि लाखों) के साथ एक वृक्षदृश्य धारण करने वाले कभी भी बंद दृश्य के कारण नहीं है? शायद कुछ कॉलबैक इंटरफ़ेस है जो दर्शक/सामग्री प्रदाता तत्वों के साथ अधिक लचीलापन की अनुमति देता है?

यह संभव एक भी TreeViewer (SWT.VIRTUAL) के लिए deffered गठबंधन करने के लिए (DeferredTreeContentManager) और आलसी (ILazyTreeContentProvider) लोड हो रहा है है? जितना मैं समझता हूं कि उदाहरणों और एपीआई को देखकर, किसी भी समय किसी एक का उपयोग करना संभव है, लेकिन दोनों संयोजन के साथ नहीं, उदाहरण के लिए , केवल दिए गए नोड के लिए दृश्यमान बच्चे लाएं और उन्हें जॉब एपीआई का उपयोग करके अलग थ्रेड में लाएं। मुझे परेशान करता है कि डिफरर्ड दृष्टिकोण सभी बच्चों को लोड करता है। हालांकि एक अलग थ्रेड में, आप अभी भी सभी तत्व लोड करते हैं, भले ही केवल एक न्यूनतम सबसेट एक बार प्रदर्शित होता है।

मैं अपने सवालों के कोड उदाहरण प्रदान कर सकते हैं यदि आवश्यक हो तो ...

मैं वर्तमान में तो अगर मैं इस बीच में कुछ के साथ आने के लिए प्रबंधन मैं खुशी इसे यहाँ साझा करेंगे उन के साथ अपने आप संघर्ष कर रहा हूँ।

धन्यवाद!

सादर, Svilen

+0

आलसी लोडिंग के लिए, दर्शक प्रदाता को रिपोर्ट करते हैं कि एक विशिष्ट तत्व प्रदर्शित होने जा रहा है (स्क्रॉलिंग या विस्तार के कारण)। सामग्री प्रदाता विधियों में नौकरी का उपयोग करके वर्तमान स्थगित कार्यान्वयन आसानी से हासिल किया जा सकता है। दोनों विधियों के साथ समस्या, वे अनन्य क्यों हो सकते हैं: आलसी लोडिंग मानती है कि आप तत्व की गणना पहले से ही जानते हैं, और सामग्री प्रदर्शित होने के समय दर्शक की सामग्री को प्रतिस्थापित करें। जब भी उपयोगकर्ता स्क्रॉल या कुछ विस्तार करता है, तो आप सामग्री को लोड नहीं करना चाहते हैं (उदा। रिमोर संसाधन से)। – benez

उत्तर

11

मैं ग्रहण ढांचे कभी कभी सिज़ोफ्रेनिया पाते हैं। मुझे संदेह है कि DeferredTreeContentManager क्योंकि यह ILazyTreeContentProvider से संबंधित है, इन मामलों में से एक है।

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

treeViewer = new TreeViewer(parent, SWT.BORDER); 
IAdapterFactory adapterFactory = new AdapterFactory(); 
Platform.getAdapterManager().registerAdapters(adapterFactory, SomePojo.class); 
treeViewer.setLabelProvider(new WorkbenchLabelProvider()); 
treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); 

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

"ओह बाई-द-तरह से, आप बड़े डेटासेट है जब, यह इस तरह से करते हैं तो कृपया", वे कहते हैं:

TableViewertableViewer = new TableViewer(parent, SWT.VIRTUAL); 
// skipping the noise 
tableViewer.setItemCount(100000); 
tableViewer.setContentProvider(new LazyContentProvider()); 
tableViewer.setLabelProvider(new TableLabelProvider()); 
tableViewer.setUseHashlookup(true); 
tableViewer.setInput(null); 

ऐसा लगता है कि पहले और दूसरे उदाहरण न केवल असंगत हैं, लेकिन वे पारस्परिक रूप से अनन्य हो। ये दो दृष्टिकोण जहां संभवतः विभिन्न टीमों द्वारा लागू किया गया था जिनके पास आम योजना नहीं थी या शायद एपीआई एक सामान्य ढांचे के संक्रमण के बीच में है। फिर भी आप अपने ही हैं।

+4

यह एक अच्छा जवाब है! आप इसे अच्छी तरह से बाहर रख देते हैं - जब एक ही समय में आलसी और स्थगित लोडिंग का उपयोग करने की बात आती है तो जेफ़स एपीआई स्वयं विरोधाभास करता है। जो शर्म की बात है। शायद एसडब्ल्यूटी आधारित समाधान के साथ आना संभव है, अपने आप से बहु थ्रेडिंग को संभालना संभव है, लेकिन मैं वास्तव में उम्मीद कर रहा था कि उन दोनों टीमों ने कॉफी ब्रेक के दौरान दुर्घटनाग्रस्तता से मुलाकात की और सोचा "आप जानते हैं, दोनों दृष्टिकोणों को जोड़कर समझ में आता है और जोड़ देगा हमारे एपीआई के लिए अतिरिक्त मूल्य। " अनुमान नहीं। :( – Svilen

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