对于海量数据的显示处理,我使用了虚拟列表virtual list control进行数据显示管理.可是发现实现的效果不是很理想.每次翻页或者拖拉滚动条查看数据的时候刷新总是能够感觉到延迟,并且CPU占用厉害.我观察了微软的一个产品(SQL Server Management Studio Express)的列表显示数据库查询结果,非常快速,翻页/滚动窗口几乎看不到明显的延迟,我也看了其他软件的海量数据列示,觉得显示效果都非常不错,感觉不到明显的延迟,资源也没有耗费的厉害.不知道它们都是使用的什么技术或者控件?关于虚拟列表实现,各位有何高见?请指点.目前我是对ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST, OnGetdispinfoList)消息进行处理,当然不要忘记设定style为LVS_OWNERDATA 类型.

解决方案 »

  1.   

    保存了网页
    准备以后研究
    http://www.codeguru.com/Cpp/controls/listview/advanced/article.php/c4151/
      

  2.   

    Maybe your codes in OnGetdispinfoList are as the following,rs->MoveFirst();
    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.
      

  3.   

    楼上的说得没错,我使用了data caching在LVN_ODCACHEHINT响应函数里面,不过发现还是不能实现期望的效果。在视图cache的数据量少的时候,感觉效果还可以,不过如果一旦数据量比较大比如2k,就发现刷新仍然感觉延迟,屏幕出现刷屏现象。 不能实现无缝的显示效果。我不知道还有否其他办法处理,觉得virtual list control 的数据update/window redraw效果并不能满足要求。
      

  4.   

    以前做过一次tree的百万以上节点的显示
    速度慢主要主现在写控件内容的时候是吧?
    我是先把数据读到容器里面,然后一次载入tree大小的那些,滚动的时候再实时的读取容器,把数据显示在tree上
    速度在显示4级节点的连接线时,速度才慢。所以我觉得你如果在list中也用这样方法,速度肯定不会是问题,因为不需要重画那么多东西
      

  5.   

    是啊,不知道哪里出了问题。感觉就是往list里面显示item数据的时候比较耗时,感觉有延迟。停滞感,屏幕会出现闪烁,觉得不太好。
      

  6.   

    一开始将DB的内容读到内存,在OnGetdispinfoList事件中从内存中拿数据显示,而不是从DB中拿数据显示。每次都从DB中拿数据当然要完蛋的。
      

  7.   

    是的,我的做法目前就是:1. 利用ADO Recordset获取DB的数据
    2. OnOdcachehintList()缓冲数据到内存数组
    3. OnGetdispinfoList()根据内存数组显示数据目前内存数组我仅仅开辟了1024个,发现效果好些,如果内存数组开的大了,刷屏严重.
    当然,是在一次缓冲数据当中,我不知道怎么内存数组的显示还要耗费很多时间么?!按理说不应该出现滚动闪烁的现象了啊.
      

  8.   

    不知道你试咋做的
    为什么一定要写入数组
    ADO的记录集就已经是很好的“容器”了
      

  9.   

    我就是通过ado从数据库获得数据放在ado recordset里,然后利用virtual list control
    进行显示啊.通过OnOdcachehintList()显示.不作PreCacheData()缓冲,显示的时候刷新延迟太明显.数组缓冲后有改善,不过还没有达到要求.