CListCtrl 项目计数限制和内存(RAM)使用
CListCtrl item count limitation and memory(RAM) usage
问题:
我编写了一个程序,其中包含 10~12 个 CListCtrl,同时向其追加行。
我从来没有删除旧项目来限制 listCtrls 的行数,并且该程序有 运行 大约 1 天。
刚刚看了进程监控,发现内存占用增加到600MB(原来是70~80MB左右)
我认为原因与CListCtrls有关。
问题:
我想将内存使用量减少到 100MB 左右。
所以,我想知道:
1. CListCtrl的行数有没有默认限制,有多少?
- 我听说 CListCtrl 有一个限制,所以不需要从我的一个队友那里手动删除顶部项目。
2。内存使用量会随着我删除top item而减少吗?
- 我不知道 CListCtrl 保存的缓冲区数据是否与我们在 UI 上看到的相同,或者它只是像
std::vector
. 中那样增加了缓冲区大小
3。如果 CListCtrl 没有 realse 在 UI 上删除的缓冲区,限制内存使用的解决方案是什么?
或者问题的原因与CListCtrl无关?
我将 LVS_EX_DOUBLEBUFFER
与 CListCtrl 一起使用。
另一方面,我使用了 10-12 个文件映射进行日志记录,每个映射大约 6MB。
这些都经过了这么多时间的测试,我相信不会有内存泄漏。
如有任何答案或参考,我们将不胜感激。
就像计算中的任何事情一样,不涉及猜测。阿list-view control也不例外。没有默认限制,控件将尽职尽责地存储您输入的所有数据,直到耗尽系统资源。它不会尝试猜测您可能认为哪些数据重要或可丢弃。
如果您需要限制列表视图控件消耗的资源量,那就由您来做。您将不得不手动删除您知道不再相关的项目。响应删除项目释放了多少内存(或者如果有的话)是一个实现细节。你无法控制这个。
如果您需要这种控件,则必须解除列表视图控件代表您管理内存的任务。值得庆幸的是,该控件为您提供了 LVS_OWNERDATA
功能,使您可以独立于控件管理后备内存,并且只告诉控件有多少项。
这通常称为 virtual list-view, and you will find countless examples of how to implement one, such as How to Use Virtual List-View Controls。
LVS_EX_DOUBLEBUFFER
扩展列表视图样式与这些无关。它仅适用于渲染,并在系统资源方面增加了一次性常量开销。
I wrote a program that has 10~12 CListCtrls which rows are appending to simultaneously.
一个具有 10-12 列的 CListCtrl 可能更适合这种情况。
...memory usage increased to 600MB
你为什么称它为 problem
?这只是一个观察。您是否将项目添加到这些控件中?多少?以什么速度?
您打算如何处理包含数千个项目的列表控件?滚动希望看到有趣的东西?
重点是 - 您可能会发现更好的数据可视化效果。
- Is there default limitation of CListCtrl's row count, and how much is it?
控件使用 int
作为项目编号,因此约为 20 亿。或者,作为
IInspectable 规定 - 当您 运行 资源不足时;以先到者为准。
- Will the memory usage be reduced as much as I delete top items?
当您释放保存数据的内存时,内存使用量会减少。如果您将字符串添加到您的列表中(而不是指向其他地方保存的数据的指针)——那么是的,删除项目将释放内存。
问题:
我编写了一个程序,其中包含 10~12 个 CListCtrl,同时向其追加行。
我从来没有删除旧项目来限制 listCtrls 的行数,并且该程序有 运行 大约 1 天。
刚刚看了进程监控,发现内存占用增加到600MB(原来是70~80MB左右)
我认为原因与CListCtrls有关。
问题:
我想将内存使用量减少到 100MB 左右。
所以,我想知道:
1. CListCtrl的行数有没有默认限制,有多少?
- 我听说 CListCtrl 有一个限制,所以不需要从我的一个队友那里手动删除顶部项目。
2。内存使用量会随着我删除top item而减少吗?
- 我不知道 CListCtrl 保存的缓冲区数据是否与我们在 UI 上看到的相同,或者它只是像
std::vector
. 中那样增加了缓冲区大小
3。如果 CListCtrl 没有 realse 在 UI 上删除的缓冲区,限制内存使用的解决方案是什么?
或者问题的原因与CListCtrl无关?
我将LVS_EX_DOUBLEBUFFER
与 CListCtrl 一起使用。另一方面,我使用了 10-12 个文件映射进行日志记录,每个映射大约 6MB。 这些都经过了这么多时间的测试,我相信不会有内存泄漏。
如有任何答案或参考,我们将不胜感激。
就像计算中的任何事情一样,不涉及猜测。阿list-view control也不例外。没有默认限制,控件将尽职尽责地存储您输入的所有数据,直到耗尽系统资源。它不会尝试猜测您可能认为哪些数据重要或可丢弃。
如果您需要限制列表视图控件消耗的资源量,那就由您来做。您将不得不手动删除您知道不再相关的项目。响应删除项目释放了多少内存(或者如果有的话)是一个实现细节。你无法控制这个。
如果您需要这种控件,则必须解除列表视图控件代表您管理内存的任务。值得庆幸的是,该控件为您提供了 LVS_OWNERDATA
功能,使您可以独立于控件管理后备内存,并且只告诉控件有多少项。
这通常称为 virtual list-view, and you will find countless examples of how to implement one, such as How to Use Virtual List-View Controls。
LVS_EX_DOUBLEBUFFER
扩展列表视图样式与这些无关。它仅适用于渲染,并在系统资源方面增加了一次性常量开销。
I wrote a program that has 10~12 CListCtrls which rows are appending to simultaneously.
一个具有 10-12 列的 CListCtrl 可能更适合这种情况。
...memory usage increased to 600MB
你为什么称它为 problem
?这只是一个观察。您是否将项目添加到这些控件中?多少?以什么速度?
您打算如何处理包含数千个项目的列表控件?滚动希望看到有趣的东西?
重点是 - 您可能会发现更好的数据可视化效果。
- Is there default limitation of CListCtrl's row count, and how much is it?
控件使用 int
作为项目编号,因此约为 20 亿。或者,作为
IInspectable 规定 - 当您 运行 资源不足时;以先到者为准。
- Will the memory usage be reduced as much as I delete top items?
当您释放保存数据的内存时,内存使用量会减少。如果您将字符串添加到您的列表中(而不是指向其他地方保存的数据的指针)——那么是的,删除项目将释放内存。