inform下需要每隔几秒向listview中写入一行数据(每行10列),实测内存增长非常明显,大约每分钟增加0.1M
由于程序需要长期稳定运行,请教下如何优化内存问题。
旧的数据可以舍弃,但优先考虑保留以方便查看,另外删除旧的行会导致行号变动,从而后台线程中对某一行的操作错误。
不能向控件里边插入“过多的”数据,控件主要是用来显示,不是用来保存数据的。如果你说“删除ListView中的行号有问题”,那么一定是行号设计需要 重构(就算是listview中只有70行数据,也应该可以显示2500行号)。当你的数据过多时,必须重新设计你的视图的业务逻辑,视图上只显示最近的 少量数据而不是全部。
另外一个方面就是,有些人多余内存大小也可能过分敏感。我手机里一个微信都占用几百兆内存,而手机里这种进程还有很多,怎么就纠结pc机上却那么吝啬内存 呢?许多人都是看了20几年的一些c语言教程受到的影响。现在的程序重视的是内存高效率缓冲的价值,也就是说不要把一大堆垃圾内容放到内存里,但并不是不 把数据大量缓存到内存里。
把数据保存到vector里,listview从vector提取数据显示。
既然又想不占用内存,还想优先考虑保留以方便查看,删除旧的行会导致行号变动等等引起的一系列问题,单单是一个控件做不到。
把写入的数据存放到某个地方,分批的形式加载到listview中,根据鼠标滚轮进行分量加载旧数据,同时移除不需要看到的数据。
是这样的,后台有两个线程对新加入的行进行处理和进一步填写,如果行号变动,操作会错误甚至异常。不知道有什么好论坛发帖机的处理方法
我觉得有些问题。
后台线程对新加入的行做即时处理。
那为何是操作 List view的数据,而没有数据源的概念?
明白了,当时为了图简便,listview兼具显示和数据源的功能了
看来结构要大改
最近也碰到listview占内存不断变大的情况,我是把240条报警数据放在list中,每1秒刷新一次,如果listview里已经有报警A了次数 就+1,如果没有就新增,也就说每次都刷新的话list会保持240条不变,实际上listview有的报警也就显示10条,但是300M的程序内存有时 会1600M。
后来经排查是因为用到了委托,button事件里new了新的窗体,对象还是应该慎用,最好初始化new一次就好,用完要回收