博瑞博客

青春是一个充满活力的季节,即便是我们失去了天使的翅膀,只要我们还有一颗青春的心,那么我们的生活依然能够如阳光般灿烂!......
现在位置:首页 > C/C++ > DuiLib : 使用CListUI显示海量数据

DuiLib : 使用CListUI显示海量数据

江湖    C/C++    2016-3-31    2246    0评论

最近遇到要在一个DuiLib::CListUI中显示动态数据的子任务.

在使用我改版的DuiLib中发现如下问题, 真杯具.

* 如果反复添加删除CListContainerElementUI, 会引起CListUI所在的Dialog退出时挂掉的问题.

 e.g. 在CListUI中增加2000条数据, 在CListUI中删掉2000条数据, 如此反复20次.  再退出该CListUI所在的Dialog, UI就挂掉了.

现象是WM_PAINT陷入了一个循环(这个正常), 但是UI显示不出来了.

 这个问题我回避了, 搞不定.  采用妥协的方法, 使CListUI只固定一个行数(e.g. 20行),  根据要显示的内容计算List的UI可见部分应该写什么数据.

 这样, 只在建立ListUI时, 插入了新的行. 以后都是更新行上的内容. 就不存在退出时UI挂掉的问题.

* 当CListUI一次添加太多数据时(e.g. 一次添加2000行), 当滚动时, List反应特别的迟钝, 有时还会导致UI卡死.

 这个问题我同样回避了, 搞不定.  采用妥协的方法, 使CListUI只固定一个行数(e.g. 20行),  根据要显示的内容计算List的UI可见部分应该写什么数据.

 这样, 只在建立ListUI时, 插入了新的行. 以后都是更新行上的内容. 就不存在滚动List自带竖向滚动条时, 引起的机率性UI卡死.


这个问题让我做了5天实验, 才想到折中的解决方法.

我采用的方法是:

* 隐藏CListUI实例自带的竖向滚动条控件, 每次只显示一页的数据

* 在CListUI实例右边的Container中自己摆一个 CScrollBarUI, 用户点击滚动条时, 记录点击的位置, 发送自定义消息, 去刷新CListUI中的显示.


实验过了, 准备20W条数据, 在CListUI中显示, 也是蛮快的, 和数据多少无关, 花费的操作和显示时间都是常量.

这个折中的方法, 让我感到很欣慰.


备注:

数据的容器使用std::vector, 而不能是std::deque, 防止数据释放时, 时间太长. 20W条数据时, std::deque释放的不是一般的慢, 和构造数据的速度比较, 慢了100倍.

使用std::vector时, 构造数据和释放数据的时间是基本相同的. 在20W条数据的条件下做过实验了.



运行效果图:

20150824164030542.gif

 

 

 

评论一下分享本文赞助博瑞

赞助博瑞X

扫码赞助博瑞
联系站长
博瑞博客
挤眼亲亲咆哮开心想想可怜糗大了委屈哈哈小声点右哼哼左哼哼疑问坏笑赚钱啦悲伤耍酷勾引厉害握手耶嘻嘻害羞鼓掌馋嘴抓狂抱抱围观威武给力
提交评论

清空信息
关闭评论