我有一个无法解决的问题。当然,在这里,我只是希望有一个可以帮助我找到解决方案的建议。
基本上我的应用程序充满了运行时生成的TPopupMenuItem
s(而所有TPopupMenu
都是硬编码的)。在某些情况下,我所做的只是隐藏/显示或启用/禁用项目,在其他情况下,我在运行时创建项目。
仅在某些计算机中,在让应用程序运行数天(2 天或更长时间)后,弹出菜单不再正常工作。
行为是:
所有TPopupmenu
项看起来都相同,并执行相同的操作。
该操作是由应用程序的第一个TPopupMenuItem
执行的操作(应用程序启动时在运行时生成的第一个操作,这是我唯一的提示)。
正确的场景中,我有(在 3 项中 - TPopupMenu
):
项目23
项目24
项目25
问题后我看到:
项目1
项目1
项目1
(其中 Item1 是属于另一个TPopupMenu
的TPopupMenuItem
)。
这能告诉你什么吗?
谢谢。
更新:
我试图查看我的弹出菜单的代码,我发现了可能是一个常见原因,这也解释了为什么 FastMM4 没有找到这个:
while mnuItem.Count > 0 do
mnuItem.Delete(0);
删除(我刚刚在文档中阅读)不会释放该项目,我应该调用免费。无论如何,当关闭应用程序时,主弹出菜单被正确释放,FastMM4不会抱怨。所以这可能是解决方案,现在我不知道为什么使用 Delete ,我没有编写该代码。
进一步更新:
我尝试制作一个示例应用程序,但我无法重现该问题,但可以肯定的是,我注意到使用它的性能要高得多(我尝试了一个具有 10000 个递归的循环):
while mnuItem.Count > 0 do
mnuItem.Items[0].Free;
我将在我的应用程序中尝试此操作(但我需要让几天时间才能真正知道我是否遇到了问题,无论如何,这肯定是一个重大改进)。
我确认问题与删除而不是免费有关。弹出菜单 wsa 在出现问题的计算机上每分钟刷新一次(因此它不是特定于操作系统或硬件的,只是特定于配置)。然后根据用户设置,菜单可能有 10 到 100 个项目,因此将其闲置数天可以达到句柄限制。
顺便说一下,以这种方式刷新弹出菜单也没有意义,所以我发现优化也删除了一个错误。
您是否检查了内存泄漏和未释放的句柄?