Listctrl 显示数据闪屏

h382501630 2009-09-14 09:43:26

在作实验中,用Listctrl来显示从网络接收到的数据,现在网络要发大量的数据过来,然后程序在接收到网络数据后,就把接收到的网络数据按协议分开后,一行一行的加到Listctrl中,现在采用的是虚拟列表的方式来操作Listctrl,所以所有的数据都由程序控制,而我的显示数据是解析数据得到一定的数据帧数或超时后才显示,现在我用的是数据帧大于30帧则显示,超过10ms也显示。然后滚动条要一直到下面显示最后加入的数据。
现在问题就来,数据都可以加入了,且也可以让滚动条显示在最下面,可是会出现闪屏。就是根本看不清现在加入了什么数据,要等到没有数据时,才能看得清数据。后来把帧数据改大和超时也加大后,帧数为50,超时为20ms,效果就会好一点,可是总感觉数据不是连续的显示,显示了,又会停一下,再显示,这样从表面上看就不是在实时的显示数据一样。

那么现在我应该怎么样处理这个问题,让Listctrl显示数据不出现闪屏,且又能比较快的显示,即能实时的显示数据。

我在网上看到用双缓冲,可是只是点到而已,不知道原理怎么样,也不知道行不行。希望能得到高手的解答。
...全文
570 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
p17939845 2009-09-18
  • 打赏
  • 举报
回复
即便是停一下也比你那种闪烁要强阿,你那样做根本没法看,有什么用?
数据太多的话没办法,这样做是最好的效果了。
saiyaman5 2009-09-18
  • 打赏
  • 举报
回复
你的显示频率也太快了,显示出来是给人看的?
显示这么快,人眼跟不上,这还有意义吗?
或者只是为了监视网络数据状况?
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
buyong SetRedraw。 就是用ShowWindow(SW_HIDE) 和ShowWindow(SW_SHOW)
h382501630 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 barech 的回复:]

有个想法,可以先锁屏,然后显示
[/Quote]

是用SetRedraw吗?

这个在虚拟列表中好像没什么用。
muzizongheng 2009-09-17
  • 打赏
  • 举报
回复
第一, 你在codeproject里搜cgridctrl来替换你的listctrl, 很好很强大,
第二, 你在更新grid里的数据时, hide、show来控制, 不需要setredraw。

应该能实现你的要求, 我的工程就是这样用的, 实时的数据一直来,且滚动条置底, 一点不闪烁。
h382501630 2009-09-17
  • 打赏
  • 举报
回复
再顶上去
怎么无人问津??
barech 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 h382501630 的回复:]
引用 18 楼 muzizongheng 的回复:
第一, 你在codeproject里搜cgridctrl来替换你的listctrl, 很好很强大,
第二, 你在更新grid里的数据时, hide、show来控制, 不需要setredraw。

应该能实现你的要求, 我的工程就是这样用的, 实时的数据一直来,且滚动条置底, 一点不闪烁。

现在只是做实验而已,不是做项目的。

所以还是想问解决Listctrl闪屏的方法或思路。
[/Quote]

有个想法,可以先锁屏,然后显示
h382501630 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 muzizongheng 的回复:]
第一, 你在codeproject里搜cgridctrl来替换你的listctrl, 很好很强大,
第二, 你在更新grid里的数据时, hide、show来控制, 不需要setredraw。

应该能实现你的要求, 我的工程就是这样用的, 实时的数据一直来,且滚动条置底, 一点不闪烁。
[/Quote]
现在只是做实验而已,不是做项目的。

所以还是想问解决Listctrl闪屏的方法或思路。
h382501630 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 p17939845 的回复:]
你设20ms? 请问谁的眼睛跟得上阿?
那样有意义吗?
设1秒刷新已经够快的了
ListCtrl有滚定条,
你也不用担心有些数据看不到

[/Quote]
现在就是这个问题了,如果是1秒刷新,那1秒过后,网络那边已经来了很多的数据
然后再加上把数据包解析出来,再显示时,就会感觉到显示一回后,又停一下,再
显示一回,这样给人的感觉是网络那边不是连续的发数据过来,就不能表现实际的
状态。因为现在把超时设置为100ms且帧数大于50帧就显示,是可以看得出加入的数据,
可就是出现显示一回后,有点停顿后再显示一回。

所以,现在就是想在最坏的情况下,网络那边连续发大量数据过来,程序里不断的接收
数据后,显示到Listctrl里,要能显示不闪屏。

现在从过程来看,发现应该是滚动条在新加入数据时,又跑回前面去影响了。
因为
m_List.EnsureVisible(m_LabelCount-1,FALSE);
m_List.Invalidate();
已经是加入数据完后就显示最后一个加入的数据行,然后新加时,看见滚动条又跑到前面
去,然后加完后又到后面,也就是此时有一个过程,滚动条滚动得太快了,从前面到后面,
每一次加入的数据都这样子,所以屏幕就闪了。

可是这个是不是我那里设置不对,还是它本身在加入数据时就这样子,重画时滚动条都
要跑回前面第一行去。那如果这样,我们是不是解决好让滚动条一直在最后就可以了。
可是让滚动条一直在后面,还不清楚怎么设置!
Qt-UI 2009-09-15
  • 打赏
  • 举报
回复
实在不行重载一个自己的CListCtrl 利用双缓冲重写OnDraw事件 或者环一个性能好点的控件
p17939845 2009-09-15
  • 打赏
  • 举报
回复
你设20ms? 请问谁的眼睛跟得上阿?
那样有意义吗?
设1秒刷新已经够快的了
ListCtrl有滚定条,
你也不用担心有些数据看不到
h382501630 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 p17939845 的回复:]

你的显示还是由数据驱动的,要改成时间驱动。
[/Quote]

用时间驱动,是用定时器定时更新吗?
那定时时短时,像上面用的20ms还会出现闪屏。
如果放得太久,如100ms或更长,那就会出现停顿的现象,好像不是实时显示一样.

或者是我理解错了,能说得更清楚一点吗?
p17939845 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 h382501630 的回复:]
引用 8 楼 yfh1985sdq 的回复:
InsertItem速度太快,即使不闪烁也会看不清,采用5楼的方法,用定时器隔一秒移动下你虚拟数据列的范围,否则频繁更新没意义。

现在就是用虚拟数据列来显示的。

而显示数据是解析数据得到一定的数据帧数或超时后才显示,现在我用的是数据帧大于30帧则显示,超过10ms也显示。然后滚动条要一直到下面显示最后加入的数据。

就是说我显示的是一次可能显示30行,或已经超时了显示现在得到的数据。

[/Quote]
你的显示还是由数据驱动的,要改成时间驱动。
h382501630 2009-09-15
  • 打赏
  • 举报
回复
还是想不出怎么解决!

怎么办?
h382501630 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 scorpio172 的回复:]
实在不行重载一个自己的CListCtrl 利用双缓冲重写OnDraw事件 或者环一个性能好点的控件
[/Quote]

双缓冲来显示,我也在网上看到其它人提到,可是就是提到而已,具体原理是什么也没有说。

而现在在达到一定帧数过后或超时晕后再显示应该是可以实现的。可是为什么还会出现闪屏。

那一位可以把双缓冲实现CListCtrl的虚拟数据列加入数据说得更详细一点。
再此多谢多谢了。
h382501630 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenyu2202863 的回复:]
virtual list

http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151

http://www.codeproject.com/KB/list/virtuallist.aspx
[/Quote]
这个看过了,这个只是介绍virtuallist用法,不知道是不是这样,但是还是出现闪屏的。
chenyu2202863 2009-09-14
  • 打赏
  • 举报
回复
virtual list

http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151

http://www.codeproject.com/KB/list/virtuallist.aspx
h382501630 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yfh1985sdq 的回复:]
InsertItem速度太快,即使不闪烁也会看不清,采用5楼的方法,用定时器隔一秒移动下你虚拟数据列的范围,否则频繁更新没意义。
[/Quote]
现在就是用虚拟数据列来显示的。

而显示数据是解析数据得到一定的数据帧数或超时后才显示,现在我用的是数据帧大于30帧则显示,超过10ms也显示。然后滚动条要一直到下面显示最后加入的数据。

就是说我显示的是一次可能显示30行,或已经超时了显示现在得到的数据。
奉海 2009-09-14
  • 打赏
  • 举报
回复
InsertItem速度太快,即使不闪烁也会看不清,采用5楼的方法,用定时器隔一秒移动下你虚拟数据列的范围,否则频繁更新没意义。
h382501630 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 p17939845 的回复:]
不要来一行就插一行,做一个缓冲区,把接到的数据放里面
然后做一个Timer,每秒钟刷新一次,每次把新来的数据插进去,然后把插入的数据从缓冲区删掉
[/Quote]
现在不是一行一行的插入,是一行一行的加入缓冲里,然后到一定的数据帧后,或已经到时间了才
显示出来的。
因为现在用的是virtuallist
加载更多回复(4)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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