List 컨트롤을 이용하여 대량의 데이터를 표시하고자 할때 InsertItem() 으로 데이터를 막 집어넣기만 할 것인가?
만일 간단한 문자열 데이터로만 이루어져 있다면 InsertItem() 으로 그냥 집어 넣으면 될 것이다.

만일 cheatengine 을 만든다고 했을때 메모리에서 100만개의 데이터를 찾았다고 가정해보자.
이 100만개의 데이터를 리스트 컨트롤을 이용하여 표시해야하는데 이번에 만든 cheatengine의 메모리 리스트컨트롤은 너무도 화려해서 각종 이미지가 포함되어 있고, 표시되는 데이터도 연관성에 따라서 매우 많은 정보를 보여준다.
그럼 리스트 컨트롤에 100만개의 데이터를 집어넣기 위해서 100만개의 이미지(갯수만큼)와 연관 데이터를 메모리에 올려야할까?
혹 만들어야 할 프로그램이 embeded system 에서 구동해야한다면 어떻게 할 것인가?

이 문제에 대한 해답을 다음링크로부터 얻을 수 있다.
http://www.codeproject.com/KB/list/BMPList.aspx

사실 영어 실력이 딸려서 열심히 설명을 읽었지만 도통 무슨내용인지 알 수가 없다. @.@~~

실제 샘플 프로젝트를 다운 받자. 

저자가 언급한 핵심 함수 부분에 브레이크 포인트를 걸어두고 실행시켜보면

아~~~!!!!!  (띵동띵동)




간단히 요약하자면

일단 100만개의 데이터(일종의 인덱스정보)를 컴팩드한 메모리 구조로 로딩한다. (어떻게 해서든지 알아낸 데이터는 있어야하므로)
 
리스트 컨트롤에 다음과 같이 row 수 만큼만 설정한다.
// This sets the count in the list without adding any items.  This is very fast.
m_cList.SetItemCountEx((int)m_MyDataArray.GetCount(), LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);

비록 데이터가 아주 많다고 설정하였지만 실제 ListCtrl 에 추가한것이 아니므로 메모리는 크게 잡아먹지 않는다.

이젠 화면에 표시되는 Item 수 만큼만 그때 그때 표시한다.
void CBMPListDlg::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
// 이 함수는 화면에 표시되는 Item 갯수만큼 호출된다.
// row 갯수가 10개 이고 column 이 5개 라면 총 50회만 호출된다.
// 이 함수에서는 화면에 표시해야할 이미지가 있을때 로딩한다. (파일시스템으로 부터 로딩하면 되겠죠)
// 이 함수에서 추가로 표시해야할 데이터가 있다면 이때 다시 로딩한다. (예를들어서 내가 찾은 메모리의 속성정보나 모듈이름 등등등등)
}

이렇게 하면 100만개의 데이터를 리스트 컨트롤로 표시하더라도 키값이 4byte 라면 4메가의 데이터만 필요하다!!!!!

당장 쓸건 아니지만 알아두면 좋을것 같아서 포스팅해본다~~~

+ Recent posts