2009-11-24 5 views
9

실제로 두 가지 질문을 가지고 있지만 그들은 가지가 하나로 이동 그래서 여기에 관련되어 ... 현재 TreeViewer을 사용하여 표시되지 않은 트리 노드의 가비지 수집을 확인하는 방법게으른 및 이연 TreeViewer 질문

(SWT.VIRTUAL) 및 ILazeTreeContentProvider? 노드에 5000 개의 자식이있는 경우 뷰어가 표시하면 따라서 Out of Memory 오류가 발생합니다. 트리에 노드 수가 많고 리프가 많고 힙 크기가 충분하지 않은 경우 오류가 발생합니다. 많은 양의 데이터 (수십만 개의 개체 또는 수백만 개의)가있는 트리 뷰어를 닫지 않은 채로보기 때문에 메모리 누출을 피하는 방법이 있습니까? 아마도 뷰어/콘텐츠 제공 업체 요소의 유연성을 높일 수있는 콜백 인터페이스가 있을까요?

그것은 하나의 TreeViewer (SWT.VIRTUAL)에 대한 (DeferredTreeContentManager)과 지연 (ILazyTreeContentProvider)로드 DEFFERED 결합 할 수 있습니까? 예제 및 API를 통해 알 수 있듯이 주어진 시간에 둘 중 하나만 사용할 수 있지만 둘 다 동시에 사용할 수는 없습니다. 주어진 노드에 대해 보이는 하위 노드 만 가져 와서 Job API를 사용하여 별도의 스레드에서 가져옵니다. 나를 귀찮게하는 것은 지연된 접근 이 모든 자식을로드한다는 것입니다. 비록 다른 스레드에서, 최소한의 서브셋 만 동시에 표시 되더라도 여전히 모든 요소를로드합니다 ( ). 필요한 경우

나는 그 동안 뭔가 가지고 올 관리하는 경우 나는 기꺼이 여기를 공유 할 수 있도록 내가 현재 그와 함께 자신을 고민하고

... 내 질문에 코드 예제를 제공 할 수 있습니다.

감사합니다.

안부, Svilen

+0

, 뷰어는 공급자에게 특정 요소가 표시 될 것임을보고합니다 (스크롤 또는 확장으로 인해). 현재 지연된 구현은 컨텐츠 제공자 메소드의 작업을 사용하여 쉽게 달성 할 수 있습니다. 두 방법의 문제점, 왜 독점적인지는 알 수 있습니다. 지연로드는 미리 요소 수를 알고 있다고 가정하고 내용이 표시되는 시간에 뷰어의 내용을 바꿉니다. 사용자가 스크롤하거나 확장 할 때마다 콘텐츠 (예 : 리메어 리소스)를로드하고 싶지 않습니다. – benez

답변

11

나는 이클립스 프레임 워크는 가끔 정신 분열증 찾을 수 있습니다. 나는 DeferredTreeContentManagerILazyTreeContentProvider과 관련되어 있기 때문에 이러한 경우 중 하나라고 생각합니다.

또 다른 예에서 EclipseCon은 지난 1 년 동안 어댑터 팩토리 (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()); 

어댑터를 등록하면 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); 

그것은 제 1 및 제 2의 예뿐만 아니라 호환되지 않는 것을 알 수 있지만, 상호 배타적이다. 이러한 두 가지 접근법은 공통 계획이 없거나 API가없는 여러 팀에서 공통적 인 프레임 워크로 전환하는 중일 것입니다. 그럼에도 불구하고 당신은 스스로 있습니다. 게으른 로딩을 위해

+4

이것은 훌륭한 대답입니다! 지연과 지연 로딩을 동시에 사용하는 경우 jface API 자체가 모순됩니다. 부끄러운 줄 알아. 아마도 SWT 기반의 솔루션을 생각해 볼 수 있습니다. 멀티 쓰레딩은 혼자서 처리 할 수 ​​있습니다.하지만 그 두 팀이 커피 휴식 시간에 우연히 만났고 "두 가지 접근법을 결합하는 것이 합리적이라고 생각했습니다. 우리 API에 대한 부가 가치 "라고 덧붙였다. 맞춰봐. :( – Svilen