2012-12-12 6 views
1

TListView에는 네트워크를 통해 수집 된 데이터가 채워집니다. 모든 데이터를 수집하려면 약 50ms가 걸리고, 목록에 추가하려면 약 5 초가 걸립니다. 필자의 초기 추측은 매번 추가 될 때마다 다시 그려지는 것이었다. TListView을 가능한 빨리 업데이트하려면 어떻게해야합니까?TListView를 업데이트하는 가장 빠른 방법

열과 항목은 모두 코드를 통해 추가됩니다.

나는 목록의 항목에 위해 BeginUpdate와 EndUpdate를 사용하여 시도하지만 많은 차이를하지 않았다. 목록에 추가되는 약 2000 개의 항목이 있습니다.

+1

begin/endupdate에 대한 호출을 보여주는 업데이트 코드를 게시하십시오! 그리고 그들이 * 외부 * 귀하의 1..2000 루프에 있는지 확인하십시오 ... – Roddy

답변

1

실제 코드를 보지 않아도 왜 업데이트가 느린 지 알 수있는 방법이 없습니다. 그러나 속도가 문제가되는 경우, 특히 많은 목록 항목이있는 경우 TListView을 대신 가상 모드 (OwnerData 속성을 true로 설정)에 넣고 상태 정보를 TListView 자체가 아닌 다른 위치에 저장해야합니다 (2000 개 항목 가상이 아닌 ListView가 처리 할 수있는 오버 헤드가 많음). 그런 다음 ListView의 Invalidate() 또는 UpdateItems() 메서드를 호출하여 다시 칠할 필요가있을 때 호출하고 이벤트를 사용하여 요청할 때마다 TListView에 상태 데이터를 제공하면됩니다. 예 :

struct MyStatusInfo 
{ 
    String Status; 
    ... 
}; 

MyStatusInfo StatusItems[2000]; 

__fastcall TForm1::TForm1(TComponent *Owner) 
    : TForm(Owner) 
{ 
    ... 
    ListView1->Items->Count = 2000; // you don't use Add() with a virtual ListView 
    ... 
} 

void __fastcalll TForm1::UpdateStatus(int Index, const String &Status, ...) 
{ 
    MyStatusInfo &Info = StatusItems[Item->Index]; 
    Info.Status = Status; 
    ... 
    ListView1->UpdateItems(Index, Index); 
} 

void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item) 
{ 
    MyStatusInfo &Info = StatusItems[Item->Index]; 
    Item->Caption = Info.Status; 
    ... 
} 
+0

그래, 내가 가상 ListViews에 대해 조금 읽고 그게 갈 길을 느꼈다. 둘 다 또는 내 자신의 ListView 쓸 수 있습니다. 코드에서 좀 더 자세히 살펴 봐야 할 것입니다. 비록 데이터/객체에 꽤 많이 접근하기 때문입니다. – inquam

+1

한 번에 수백만 개의 항목을 표시하는 데 가상'TListView '를 사용합니다. 특히 OnDataHint 이벤트를 사용하여 메모리 사용을 최적화 할 때 모든 항목을 할당 할 필요가없는 경우 성능이 매우 좋습니다 한 번에 메모리. 내 전체 데이터는 최대 GB 수의 데이터까지 될 수 있지만 내 ListView 사용량은 약 15-20MB의 메모리 만 차지합니다. –

0

나는 동시에 BeginUpdate하지 않았기 때문에 즉, 도움이된다면 모르겠지만, 가치 시도 : = false를 사용하면서

1) 다음은

2)를 구축 시도 활성화를 작성하십시오 TListItems를 가져 와서 TListView의 Items 속성에 직접 할당하십시오.

관련 문제