德尔福,应用程序长时间空闲后,TPopupMenuItems 行为异常



我有一个无法解决的问题。当然,在这里,我只是希望有一个可以帮助我找到解决方案的建议。

基本上我的应用程序充满了运行时生成的TPopupMenuItem s(而所有TPopupMenu都是硬编码的)。在某些情况下,我所做的只是隐藏/显示或启用/禁用项目,在其他情况下,我在运行时创建项目。

仅在某些计算机中,在让应用程序运行数天(2 天或更长时间)后,弹出菜单不再正常工作。

行为是:

所有TPopupmenu项看起来都相同,并执行相同的操作。

该操作是由应用程序的第一个TPopupMenuItem执行的操作(应用程序启动时在运行时生成的第一个操作,这是我唯一的提示)。

想象一下,在

正确的场景中,我有(在 3 项中 - TPopupMenu):

项目23

项目24

项目25

问题后我看到:

项目1

项目1

项目1

(其中 Item1 是属于另一个TPopupMenuTPopupMenuItem)。

这能告诉你什么吗?

谢谢。

更新:

试图查看我的弹出菜单的代码,我发现了可能是一个常见原因,这也解释了为什么 FastMM4 没有找到这个:

   while mnuItem.Count > 0 do
      mnuItem.Delete(0);

删除(我刚刚在文档中阅读)不会释放该项目,我应该调用免费。无论如何,当关闭应用程序时,主弹出菜单被正确释放,FastMM4不会抱怨。所以这可能是解决方案,现在我不知道为什么使用 Delete ,我没有编写该代码。

进一步更新:

我尝试

制作一个示例应用程序,但我无法重现该问题,但可以肯定的是,我注意到使用它的性能要高得多(我尝试了一个具有 10000 个递归的循环):

while mnuItem.Count > 0 do
      mnuItem.Items[0].Free;

我将在我的应用程序中尝试此操作(但我需要让几天时间才能真正知道我是否遇到了问题,无论如何,这肯定是一个重大改进)。

我确认问题与删除而不是免费有关。弹出菜单 wsa 在出现问题的计算机上每分钟刷新一次(因此它不是特定于操作系统或硬件的,只是特定于配置)。然后根据用户设置,菜单可能有 10 到 100 个项目,因此将其闲置数天可以达到句柄限制。

顺便说一下,以这种方式刷新弹出菜单也没有意义,所以我发现优化也删除了一个错误。

您是否检查了内存泄漏和未释放的句柄?

最新更新