大数据插入CMFCListCtrl如何使界面不假死?

Fungyun 2012-04-07 02:21:00
是这样的,程序大概平均每秒要向list插入1000多条数据,是逐条插入,即收到1条就向list插一条。原先逻辑是,开了一个工作线程是做接收、处理数据然后将得到的数据一条条sendmessage至listview窗口上,然后在主线程中进行InsertItem的操作,类似:
UINT MonitorDataThread(LPVOID lpVoid)
{

DWORD dwDCCount = GetDataCacheCount();//某一刻得到数据个数
for(DWORD dwDCIndex = 0; dwDCIndex < dwDCCount; ++dwDCIndex)
{
//处理得到数据
.......
//逐条发送数据
SendMessage(....);
}
}
然后在主线程中,
void UpdateView(MonitorViewData* pData)
{
InsertItem(....);//插入数据
}
现在的问题,这样的思路写出来的效果是,插入过程中界面卡死,插入完后才恢复正常。请问有没有很好的解决方案可以避免?
...全文
334 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangkefengyu 2012-06-28
  • 打赏
  • 举报
回复
在线程中 sendmessage 后 Sleep() 是不是可以呢
  • 打赏
  • 举报
回复
建意开一个线程,显示数据处理请等待...................
mfc_love 2012-04-12
  • 打赏
  • 举报
回复
你要做实时显示吗?每秒1千条,用户根本看不过来。只能看到屏幕一直在刷,数据根本就看不到嘛。没有实际意义啊。
如果不用做实时显示,那可以插入前先调用一下SetRedraw(false)把列表刷新功能关掉,插完之后再调用SetRedraw(true)更新。或者可以根据策略,插入一定数量后刷新一下。系统默认每插入一条数据都刷新的
Fungyun 2012-04-12
  • 打赏
  • 举报
回复
或者改成用每来一条数据就开启一个界面线程来Insert,但这样假如数据量多了,线程数也随之多了?
Fungyun 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

问题的本质是,数据与显示逻辑上分开,不把所有的数据都放置在显示容器里
你接收数据的时候,只与数据容器打交道,比如1秒1000,这是没有办法的,根据速率,选择合适的方法

你的显示容器,只能放有限的数据(比如5000行的List,不会老年痴呆的),这个List定时到数据容器中取数据,刷新(比如每两秒取最新的100条展示)。

为了展示数据快速吞吐的状态,可以做一个Static,它的更新成……
[/Quote]
谢谢OK1234567的指教,但对于你提到的第三个关键点“定时刷新N条最新数据(如每两秒取最新的100条展示)”,那这样的话,我最终List上呈现的数据是不完整的咯?类似,我一共只有2S接收并显示数据,照这样每2S显示最新100条,而我本来2S存在数据容器的条数是2000条,结果list只有100条数据呀,之前的数据没有显示出来?
ok1234567 2012-04-11
  • 打赏
  • 举报
回复
问题的本质是,数据与显示逻辑上分开,不把所有的数据都放置在显示容器里
你接收数据的时候,只与数据容器打交道,比如1秒1000,这是没有办法的,根据速率,选择合适的方法

你的显示容器,只能放有限的数据(比如5000行的List,不会老年痴呆的),这个List定时到数据容器中取数据,刷新(比如每两秒取最新的100条展示)。

为了展示数据快速吞吐的状态,可以做一个Static,它的更新成本极低,可以同步一条数据(PostMessage),眼花缭乱的效果

瞧,你的项目中有三个关键点
1、数据容器:吞吐数据,后台线程
2、传输展示:同步一条数据,供观察
3、列表显示:定时刷新N条最新数据,供阅读
Fungyun 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 5 楼 的回复:
引用 3 楼 的回复:

一秒1000多条,List可能受不了的,数据的累积需要消耗大量内存
大量数据为什么不分页显示呢?没有可以直接看到上千条记录的屏幕吧:)

分页显示了的,当前List框内可显示出的条数为30,如果你要看之前或后面的内容,是通过右边的下拉条上下拉动可看。
可不可以做成table页的list,每一个list只显示那么多条,超过了自动开一……
[/Quote]
请教如何实现“数据和显示弱同步”呀?以前没试过。
ok1234567 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:

一秒1000多条,List可能受不了的,数据的累积需要消耗大量内存
大量数据为什么不分页显示呢?没有可以直接看到上千条记录的屏幕吧:)

分页显示了的,当前List框内可显示出的条数为30,如果你要看之前或后面的内容,是通过右边的下拉条上下拉动可看。
可不可以做成table页的list,每一个list只显示那么多条,超过了自动开一个table页继续显示。
[/Quote]

List的数据插入/绘制,都比较耗费时间
多个table可以考虑
也可以考虑:数据和显示弱同步,数据更新可能是毫秒级别,List刷新则以秒级完成

一般情况下,数据是数据,显示是显示,两者逻辑上分开
显示一般是交互态比较好
如果想展示程序在快速运行中的样子,那么可以整一个酷酷的Static在界面上...
gg606 2012-04-07
  • 打赏
  • 举报
回复
PostMessage更好

楼上说的很好,我也觉得可以缓存一下,需要时再实际插入
hdg3707 2012-04-07
  • 打赏
  • 举报
回复
1秒钟1000多条恐怕得用映象文件了,收到文件后先存在映象文件,然后定时从映象文件里读出一块数据放入控件.因为屏幕在限,不可能显示上百行数据,只能通过滚动条来看.
除了定时放入控件后,还可以响应各消息来放入控件,比如响应滚动条消息,响应键盘按键,响应鼠标消息等来放入控件
hdg3707 2012-04-07
  • 打赏
  • 举报
回复
1秒钟1000多条恐怕得用映象文件了,收到文件后先存在映象文件,然后定时从映象文件里读出一块数据放入控件.因为屏幕在限,不可能显示上百行数据,只能通过滚动条来看.
除了定时放入控件后,还可以响应各消息来放入控件,比如响应滚动条消息,响应键盘按键,响应鼠标消息等来放入控件
Fungyun 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

一秒1000多条,List可能受不了的,数据的累积需要消耗大量内存
大量数据为什么不分页显示呢?没有可以直接看到上千条记录的屏幕吧:)
[/Quote]
分页显示了的,当前List框内可显示出的条数为30,如果你要看之前或后面的内容,是通过右边的下拉条上下拉动可看。
可不可以做成table页的list,每一个list只显示那么多条,超过了自动开一个table页继续显示。
xiaohuh421 2012-04-07
  • 打赏
  • 举报
回复
这么多数据,要使用虚拟列表模式了.
ok1234567 2012-04-07
  • 打赏
  • 举报
回复
一秒1000多条,List可能受不了的,数据的累积需要消耗大量内存
大量数据为什么不分页显示呢?没有可以直接看到上千条记录的屏幕吧:)
Fungyun 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SendMessage换成PostMessage
[/Quote]

试了,貌似没用
wh0721 2012-04-07
  • 打赏
  • 举报
回复
SendMessage换成PostMessage

15,471

社区成员

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

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