【问题标题】:CListCtrl item count limitation and memory(RAM) usageCListCtrl 项目计数限制和内存 (RAM) 使用
【发布时间】:2021-10-12 08:04:15
【问题描述】:

问题:

我写了一个程序,它有 10~12 个 CListCtrls 行同时追加。

我从来没有删除旧项目来限制listCtrls的行数,程序已经运行了大约1天。
刚刚看到进程监视器,发现内存使用量增加到了600MB(原来是70~80MBs左右)

我认为原因与CListCtrls有关。

问题:

我想将内存使用量减少到 100MB 左右。

所以,我想知道:

1. CListCtrl的行数有默认限制吗?是多少?

  • 我听说 CListCtrl 有一个限制,所以不需要手动从我的一位队友那里删除顶级项目。

2。内存使用量是否会像我删除最重要的项目一样减少?

  • 我想知道 CListCtrl 保存的缓冲区数据与我们在 UI 上看到的相同,或者它只会像 std::vector 那样增加缓冲区大小。

3.如果 CListCtrl 没有实现在 UI 上移除的缓冲区,那么限制内存使用的解决方案是什么?

  • 或者问题的原因可能与 CListCtrl 无关?
    我将LVS_EX_DOUBLEBUFFER 与 CListCtrls 一起使用。

  • 另一方面,我使用 10-12 个文件映射进行日志记录,每个映射大约 6MB。 这些已经测试了这么久,我相信没有内存泄漏。

任何答案或参考将不胜感激,谢谢。

【问题讨论】:

    标签: memory-leaks mfc clistctrl


    【解决方案1】:

    就像计算中的任何事情一样,不涉及猜测。 list-view control 也不例外。没有默认限制,控件将尽职尽责地存储您扔给它的所有数据,直到它耗尽系统资源。它不会尝试猜测您认为哪些数据重要或可丢弃。

    如果您需要限制列表视图控件消耗的资源量,那就由您来做。您将不得不手动删除您知道不再相关的项目。响应删除项目而释放了多少内存(或者如果有的话)是一个实现细节。你无法控制它。

    如果您需要这种控制,则必须将列表视图控制从管理内存中解放出来。值得庆幸的是,控件为您提供了LVS_OWNERDATA 功能,允许您管理与控件分开的后备内存,并且只告诉控件有多少项。

    这通常称为virtual list-view,您会发现无数示例说明如何实现它,例如How to Use Virtual List-View Controls

    LVS_EX_DOUBLEBUFFER 扩展列表视图样式与此无关。它仅与渲染有关,并在系统资源方面增加了一次性常量开销。

    【讨论】:

    • 感谢您的宝贵时间,我要谷歌虚拟列表视图的示例
    【解决方案2】:

    我写了一个程序,它有 10~12 个 CListCtrls,这些行同时附加到。

    一个 10-12 列的 CListCtrl 可能会更好。

    ...内存使用量增加到 600MB

    你为什么称它为problem?这只是一个观察。您是否将项目添加到这些控件?多少?以什么速度?

    您打算如何处理包含数千个项目的列表控件?滚动以希望看到有趣的东西?

    重点是 - 您可能会发现更好的数据可视化。

    1. CListCtrl的行数有默认限制吗?是多少?

    控件使用int 作为项目编号,因此约为20 亿。或者,作为 IInspectable 声明 - 当您用完资源时;以先到者为准。

    1. 内存使用量是否会像我删除最重要的项目一样减少?

    当您释放保存数据的内存时,内存使用量将减少。如果您将字符串添加到列表中(而不是指向其他地方保存的数据的指针) - 那么是的,删除项目将释放内存。

    【讨论】:

    • 感谢您的回复,通常情况下,该进程运行在大约 24GB 内存的系统上,它分叉 10-12 个虚拟机(例如模拟器),每个虚拟机拥有 1.5-3GB 的内存。这意味着当它运行时,CPU 和 RAM 使用率达到 95%-99% 以上。所以减少自己的内存使用很重要。 ListCtrl 仅用于日志监视器,并且不必分开每个。有些问题很清楚,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-02-15
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多