gpt4 book ai didi

delphi - TVirtualStringTree - 重置非可视节点和内存消耗

转载 作者:行者123 更新时间:2023-12-03 14:49:00 27 4
gpt4 key购买 nike

我有一个应用程序,可以从二进制日志文件加载记录并将其显示在虚拟 TListView 中。一个文件中可能有数百万条记录,并且显示可以由用户过滤,所以我不会一次性加载内存中的所有记录,并且ListView项索引与文件记录偏移量(例如,列表项 1 可能是文件记录 100)。我使用 ListView 的 OnDataHint 事件仅加载 ListView 实际感兴趣的项目的记录。当用户滚动时,OnDataHint 指定的范围会发生变化,允许我释放不在新范围内的记录,并分配新记录根据需要。

这工作正常,速度可以接受,并且内存占用非常低。

我目前正在评估 TVirtualStringTree 作为 TListView 的替代品,主要是因为我想添加扩展/折叠跨多行记录的功能(我可以通过动态递增/递减项目计数来使用 TListView 来捏造它,但是这不像使用真实的树那么简单)。

在大多数情况下,我已经能够移植 TListView 逻辑并让一切按照我的需要工作。不过,我注意到 TVirtualStringTree 的虚拟范例有很大不同。它不具有与 TListView 相同的 OnDataHint 功能(我可以使用 OnScroll 事件来伪造它,这允许我的内存缓冲区逻辑继续工作),并且我可以使用 OnInitializeNode 事件将节点与分配的记录关联起来.

但是,一旦树节点被初始化,它就会在树的生命周期内保持初始化状态。这对我来说不好。当用户滚动并从内存中删除记录时,我需要重置这些非可视节点,而不将它们完全从树中删除,或丢失它们的展开/折叠状态。当用户将它们滚动回 View 时,我可以重新分配记录并重新初始化节点。基本上,就虚拟化而言,我想让 TVirtualStringTree 尽可能像 TListView 那样工作。

我已经看到 TVirtualStringTree 有一个 ResetNode() 方法,但是每当我尝试使用它时,我都会遇到各种错误。一定是我用错了。我还想到只将每个节点内的数据指针存储到我的记录缓冲区,然后分配和释放内存,相应地更新这些指针。最终效果也不是很好。

更糟糕的是,我最大的测试日志文件中有大约 500 万条记录。如果我一次用那么多节点初始化 TVirtualStringTree(当日志显示未过滤时),树的节点的内部开销会占用高达 260MB 的内存(尚未分配任何记录)。而使用 TListView,加载相同的日志文件及其背后的所有内存逻辑,我只需使用几 MB 就可以了。

有什么想法吗?

最佳答案

您可能不应该切换到 VST,除非您至少需要使用 VST 的一些标准列表框/ ListView 所没有的优秀功能。但与扁平的项目列表相比,当然会有很大的内存开销。

我认为仅使用 TVirtualStringTree 能够展开和折叠跨多行的项目并没有真正的好处。你写

mainly because I want to add the ability to expand/collapse records that span multiple lines (I can fudge it with the TListView by incrementing/decrementing the item count dynamically, but this is not as straight forward as using a real tree).

但您可以轻松实现这一点,而无需更改项目计数。如果将列表框的 Style 设置为 lbOwnerDrawVariable 并实现 OnMeasureItem 事件,则可以根据需要调整高度以仅绘制第一个或所有线路。手动绘制扩展三角形或 TreeView 的小加号应该很容易。 Windows API 函数 DrawText()DrawTextEx()可用于测量和绘制(可选自动换行)文本。

编辑:

抱歉,我完全忽略了您现在使用的是 ListView 而不是列表框的事实。事实上,没有办法在 ListView 中拥有不同高度的行,所以这是没有选择的。您仍然可以使用顶部带有标准标题控件的列表框,但这可能不支持您现在从 ListView 功能中使用的所有内容,并且它本身可能比动态显示和隐藏 ListView 行要完成更多甚至更多的工作。模拟折叠和展开。

关于delphi - TVirtualStringTree - 重置非可视节点和内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814565/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com