对于海量数据的显示处理,我使用了虚拟列表virtual list control进行数据显示管理.可是发现实现的效果不是很理想.每次翻页或者拖拉滚动条查看数据的时候刷新总是能够感觉到延迟,并且CPU占用厉害.我观察了微软的一个产品(SQL Server Management Studio Express)的列表显示数据库查询结果,非常快速,翻页/滚动窗口几乎看不到明显的延迟,我也看了其他软件的海量数据列示,觉得显示效果都非常不错,感觉不到明显的延迟,资源也没有耗费的厉害.不知道它们都是使用的什么技术或者控件?关于虚拟列表实现,各位有何高见?请指点.目前我是对ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST, OnGetdispinfoList)消息进行处理,当然不要忘记设定style为LVS_OWNERDATA 类型.
准备以后研究
http://www.codeguru.com/Cpp/controls/listview/advanced/article.php/c4151/
rs->Move(...)
fill strings
...Of cource, it will be slow, it is called too frequently. For example,
20 rows and 5 columns,
20*5 times called every painting message.Method 1:
We can handle LVN_ODCACHEHINT, catch all strings we want.
Thus it is simply copy in OnGetdispinfoList.Method 2:
Overide the WM_PAINT, Default() can't be called.
速度慢主要主现在写控件内容的时候是吧?
我是先把数据读到容器里面,然后一次载入tree大小的那些,滚动的时候再实时的读取容器,把数据显示在tree上
速度在显示4级节点的连接线时,速度才慢。所以我觉得你如果在list中也用这样方法,速度肯定不会是问题,因为不需要重画那么多东西
2. OnOdcachehintList()缓冲数据到内存数组
3. OnGetdispinfoList()根据内存数组显示数据目前内存数组我仅仅开辟了1024个,发现效果好些,如果内存数组开的大了,刷屏严重.
当然,是在一次缓冲数据当中,我不知道怎么内存数组的显示还要耗费很多时间么?!按理说不应该出现滚动闪烁的现象了啊.
为什么一定要写入数组
ADO的记录集就已经是很好的“容器”了
进行显示啊.通过OnOdcachehintList()显示.不作PreCacheData()缓冲,显示的时候刷新延迟太明显.数组缓冲后有改善,不过还没有达到要求.