Virtual List 虚拟列表 速度慢 卡住 主线程 问题

HackerJLY 2011-12-09 04:19:03
Virtual List 虚拟列表 速度慢 卡住 主线程 问题

我处理的是 LVN_ODCACHEHINT 和 LVN_GETDISPINFO,LVN_ODCACHEHINT 里 负责从数据库里读取数据,读到 CArray 里面,LVN_GETDISPINFO 里负责显示数据到列表

目前问题是 LVN_ODCACHEHINT 里从数据库里读取数据太慢,会导致主线程很卡

请问有没有好办法解决,或者提供一个比 虚拟列表 好的列表
...全文
268 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-02-10
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
HackerJLY 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yu52000guang 的回复:]

你的问题跟虚列表效率没关系啊,关键在于数据处理,数据量很大,不可能全部读取。需要显示哪行的哪些字段,就读取这么一点数据就好了,可以先SetItemCount,然后用一个线程读取需要的数据,就这么点数据不会卡住。如果是快速拖动列表,可以加个sql语句执行的队列,比如20ms执行一次,多条的话只执行第一条,其余删掉。

没什么更好的办法。想效率更高在数据库前端加一层缓存。
[/Quote]
我现在起了一个专门读取数据的线程,用事件通知的方式通知线程去读取数据,有个线程是专门定时判断当前显示的Item范围的,如果范围变化,就通知数据读取线程去读取数据显示,即使Item范围不变化,其他地方更新的时候也可以用这个事件来通知更新。。。
缺点是:有延时,其他还好。。。
HackerJLY 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaopan 的回复:]

引用 11 楼 hackerjly 的回复:
引用 10 楼 xiaopan 的回复:

引用 8 楼 hackerjly 的回复:
虚拟列表 + 辅助读取数据线程,方案如何设计呢?谁设计过啊?

确实有这个问题,关键是怎么样让item里面的数据能显式的更新,比如颜色变化,比如闪烁一下,
通知列表更新,就是:Invalidate吧??
[/Quote]
颜色变化、闪烁一下 我没那么用过,不过普通的数据更新很简单的,把虚拟列表的源数据改了,通知列表去取最新数据显示,好几个函数都可以做到 SetItemCount、SetItemCountEx、RedrawItems、RedrawWindow、UpdateWindow、SendMessage WM_PAINT 。。。
xiaopan 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hackerjly 的回复:]
虚拟列表 + 辅助读取数据线程,方案如何设计呢?谁设计过啊?
[/Quote]
我现在做的是网络数据,通过socket传送,就是这个实时更新问题没有解决。
因为一条数据过来后,要在item里面显示,然后在该位置闪烁一下或者是颜色变化一下,提示客户,
类似股票那种功能,不知道兄弟有没好的办法??
Icer 2011-12-28
  • 打赏
  • 举报
回复
你的问题跟虚列表效率没关系啊,关键在于数据处理,数据量很大,不可能全部读取。需要显示哪行的哪些字段,就读取这么一点数据就好了,可以先SetItemCount,然后用一个线程读取需要的数据,就这么点数据不会卡住。如果是快速拖动列表,可以加个sql语句执行的队列,比如20ms执行一次,多条的话只执行第一条,其余删掉。

没什么更好的办法。想效率更高在数据库前端加一层缓存。
xiaopan 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hackerjly 的回复:]
引用 10 楼 xiaopan 的回复:

引用 8 楼 hackerjly 的回复:
虚拟列表 + 辅助读取数据线程,方案如何设计呢?谁设计过啊?

我现在做的是网络数据,通过socket传送,就是这个实时更新问题没有解决。
因为一条数据过来后,要在item里面显示,然后在该位置闪烁一下或者是颜色变化一下,提示客户,
类似股票那种功能,不知道兄弟有没好的办法??


你这个有……
[/Quote]

确实有这个问题,关键是怎么样让item里面的数据能显式的更新,比如颜色变化,比如闪烁一下,
通知列表更新,就是:Invalidate吧??
HackerJLY 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaopan 的回复:]

引用 8 楼 hackerjly 的回复:
虚拟列表 + 辅助读取数据线程,方案如何设计呢?谁设计过啊?

我现在做的是网络数据,通过socket传送,就是这个实时更新问题没有解决。
因为一条数据过来后,要在item里面显示,然后在该位置闪烁一下或者是颜色变化一下,提示客户,
类似股票那种功能,不知道兄弟有没好的办法??
[/Quote]

你这个有什么问题吗?
用 虚拟列表 的话,只要Socket来了数据,更新一下内存里的结构体数组,然后通知列表更新就可以了吧。。。
HackerJLY 2011-12-16
  • 打赏
  • 举报
回复
虚拟列表 + 辅助读取数据线程,方案如何设计呢?谁设计过啊?
jixiang1983 2011-12-12
  • 打赏
  • 举报
回复
这不是虚拟列表显示数据的问题,而是你的程序从数据库读数据慢的问题,使用多线程必然的了,创建一个线程专门处理读数据问题
HackerJLY 2011-12-10
  • 打赏
  • 举报
回复
数据量很大,至少 几十万 条数据,只能把要显示的那几条数据读到内存,不能全部读到内存
wyx100 2011-12-10
  • 打赏
  • 举报
回复
开线程读取数据库,等数据都读到内存,整理好了,再通知主线程用虚列表加载显示
HackerJLY 2011-12-10
  • 打赏
  • 举报
回复
谁有 弄 虚拟列表 出现此问题的 实战经验啊?
oyljerry 2011-12-09
  • 打赏
  • 举报
回复
开线程读取数据库,等数据都读到内存,整理好了,再通知主线程用虚列表加载显示
ndy_w 2011-12-09
  • 打赏
  • 举报
回复
内存里缓存是有必要的。控件随时可能重绘,每次都从数据库取就过分了。
如果信息太多只能缓存一部分,那么消息线程检查缓存没有,可以先给工作线程布置任务,然后回答一个空的结果。工作线程完成任务后,更新缓存,再刷新该item。
kyotrue 2011-12-09
  • 打赏
  • 举报
回复
消息是主线程处理的,你在里面做I/O操作当然会卡住了。
可以开个工作线程读数据库,读完后再发消息通知主线程刷界面。流程大致就这样,一个后台线程缓冲数据,不过同步处理起来就不是那么简单了。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧