2009-11-24 28 views
9

Aslında iki sorum var ama onlar tür onlar biri olarak gitmek işte ilişkilidir ... şu anda TreeViewer kullanılarak görüntülenmeyen ağaç düğümleri çöp toplama sağlamak için nasılTembel ve Ertelenmiş TreeViewer soruları

(SWT.VIRTUAL) ve ILazeTreeContentProvider? Düğüm bir 5000 çocuğa sahipse, görüntüleyen kişi tarafından görüntülendiğinde, hiçbir zaman izin vermezler, dolayısıyla Bellek Yetersiz Hata, ağacınızda çok sayıda düğüm varsa ve yapraklar büyükse ve yığın boyutu yeterince büyük değilse. Bellek sızıntılarından kaçınmak için, bir ağaç görüntüleyiciyi büyük miktarda veri (yüz binlerce nesne veya hatta milyonlarca) ile hiçbir zaman kapalı görüşten kaynaklanan bir tür en iyi uygulama var mı? Belki de belki görüntüleyici/içerik sağlayıcı unsurları ile daha fazla esneklik sağlayan bazı geri çağırma arayüzü var mı?

tek TreeViewer (SWT.VIRTUAL) için (DeferredTreeContentManager) VE tembel (ILazyTreeContentProvider) yükleme deffered birleştirme mümkün mü? Örneklere ve API'lara bakarak anladığım kadarıyla, her ikisini de yalnızca bir zamanda değil, her ikisinde de kullanılabilir. , YALNIZCA verilen bir düğüm için görünür olan çocukları getirir VE bunları, İş API'sini kullanarak ayrı bir iş parçacığıyla getir. Beni rahatsız eden, ertelenmiş yaklaşımın TÜM çocuklara yüklediğidir. Farklı bir iş parçacığına rağmen, yine de en az bir altkümenin aynı anda görüntülenmesine rağmen, tüm öğeleri yükler. Gerekirse

Ben bu arada bir şey ile gelip yönetmek Eğer ben memnuniyetle burada paylaşırım yüzden şu anda olanlarla kendim mücadele ediyorum

... sorularımın kod örneklerini sağlayabilir.

Teşekkürler!

Selamlar, Svilen

+0

, görüntüleyenler sağlayıcıya, belirli bir öğenin görüntüleneceğini bildirir (kaydırma veya genişletme nedeniyle). Mevcut ertelenmiş uygulamalar, içerik sağlayıcı yöntemlerinde bir iş kullanılarak kolayca elde edilebilir. her iki yöntemde de sorun, neden özel olabilirler: tembel yükleme, önceden öğe sayısını bildiğinizi varsayar ve içerik görüntülendiğinde görüntüleyicinin içeriğini değiştirir. İçeriği (örneğin, bir remore kaynağından) yüklemek istemediğinizde, kullanıcı bir şeyi her kaydırdığında veya genişletdiğinde. – benez

cevap

11

Ben Eclipse çerçeve bazen şizofren bulabilirsiniz. DeferredTreeContentManager'un ILazyTreeContentProvider ile ilgili olduğundan şüpheleniyorum.

Başka bir örnekte, EclipseCon'da geçtiğimiz yıl, modellerinizi o an için gereken bağlama bağlamına uyarlamak için adaptör fabrikalarını (IAdapterFactory) kullanmanız önerilir. Örneğin, modelinizin bir ağaçta görünmesini istiyorsanız, bu şekilde yapın.

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

senin adaptörü Kayıt ve BaseWorkbenchContentProvider fabrikasında uyarlanmasını bulacaksınız. Olağanüstü. Bir plan gibi görünüyor.

"Ah by-yönlü, sen büyük veri kümelerini olduğunda, bu şekilde yapın" derler:

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); 

Birinci ve ikinci örnekler sadece uyumsuz çıkıyor, ama onlar karşılıklı olarak münhasır. Muhtemelen ortak bir plana sahip olmayan farklı takımlar veya belki de API tarafından uygulanan bu iki yaklaşım, ortak bir çerçeveye geçişin ortasındadır. Yine de kendi başınasın. Tembel yükleme için

+4

Bu harika bir cevap! Güzel koydu - jface API, aynı anda tembel ve ertelenmiş yükleme kullanımı söz konusu olduğunda çelişiyor. Bu utanç verici. Belki de SWT tabanlı bir çözüm bulmak, kendi başınıza çok iş parçacığı kullanmak mümkündür, ancak gerçekten bu iki takımın bir kahve molasında yanlışlıkla karşılaştığını umuyordum ve “biliyorsunuz, her iki yaklaşımı bir araya getirerek mantıklı ve ekleyeceksiniz. API'mıza ek bir değer. " Değil sanırım. :( – Svilen