Delphi,TPopupMenuItems在应用程序长时间闲置后表现异常

Delphi,TPopupMenuItems在应用程序长时间闲置后表现异常,delphi,debugging,popupmenu,Delphi,Debugging,Popupmenu,我有一个无法解决的问题。当然,在这里我只是希望有一个建议,可以帮助我找到一个解决方案 基本上,我的应用程序充满了运行时生成的TPopupMenuItems(而所有TPopupMenus都是硬编码的)。在某些情况下,我所做的只是隐藏/显示或启用/禁用项,在其他情况下,我在运行时创建项 仅在某些机器中,在应用程序运行数天(2天或更长时间)后,弹出菜单不再正常工作 这种行为是: 所有的TPopupmenu项看起来都是相同的,并且执行相同的操作 该操作是由应用程序的第一个TPopupMenuItem执行

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

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

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

这种行为是:

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

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

想象一下,在我的正确场景中(在3个项目中-
tpopumenu
):

项目23

项目24

项目25

问题解决后,我看到:

项目1

项目1

项目1

(其中Item1是属于另一个
tpopupmenus
TPopupMenuItem

这能告诉你什么吗

谢谢

更新:

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

   while mnuItem.Count > 0 do
      mnuItem.Delete(0);
删除(我只是在文档中读到)不会释放该项目,我应该调用free。无论如何,当关闭应用程序时,主弹出菜单被正确释放,FastMM4不会抱怨。所以这可能就是解决方案,现在我不知道为什么要使用Delete,我没有编写代码

进一步更新:

我尝试创建一个示例应用程序,但无法重现该问题,但我确实注意到使用该应用程序的性能要高得多(我尝试了一个包含10000个递归的循环):


我会在我的应用程序中尝试这一点(但我需要让几天过去,才能真正知道我是否遇到了问题,无论如何,这肯定是一个重大改进).

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

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

我确认问题已链接到删除而不是释放。Popupmenu wsa在出现问题的机器上每分钟刷新一次(因此它不是特定于操作系统或硬件的,只是特定于配置)。然后,根据用户设置,菜单可能有10到100个项目,因此让它闲置几天,就有可能达到手柄限制


顺便说一句,以这种方式刷新弹出菜单也没有任何意义,因此我还发现一个优化删除了一个bug。

我确认问题是链接到删除而不是免费的。Popupmenu wsa在出现问题的机器上每分钟刷新一次(因此它不是特定于操作系统或硬件的,只是特定于配置)。然后,根据用户设置,菜单可能有10到100个项目,因此让它闲置几天,就有可能达到手柄限制


顺便说一句,以这种方式刷新弹出菜单也是没有意义的,因此我还发现一个优化消除了一个bug。

是的,使用FastMM4时,我使用了FullDebugMode。不管怎样,这就是我为泄密所做的。对于句柄,我在Process monitor中检查了句柄计数,但这是一个正常计数(这是我被告知检查句柄泄漏的方式:如果这个数字高,则表示存在句柄泄漏……但可能是我错了)。如果发生泄漏,您将看到句柄计数随时间增加。PS:我知道我给了你正确的答案,并且是第一个这样做的,请记住投票:)是的,使用FastMM4,我使用FullDebugMode。不管怎样,这就是我为泄密所做的。对于句柄,我在Process monitor中检查了句柄计数,但这是一个正常计数(这是我被告知检查句柄泄漏的方式:如果这个数字高,则表示存在句柄泄漏……但可能是我错了)。如果发生泄漏,您将看到句柄计数随时间增加。PS:我知道我给了你正确的答案,并且是第一个这样做的,请记住投票:)你能展示你创建PopupMenuItems的代码吗?有错误的机器有什么共同点?相同的操作系统版本,缺少某些更新,计算机中的物理部分,运行的应用程序版本与测试版本不同+1对于Marjan,我们需要查看一些代码是的,我添加了一些代码,请查看我的更新并对其进行评论。您能否显示创建PopupMenuItems的代码?出现错误的机器有哪些共同点?相同的操作系统版本,缺少某些更新,计算机中的物理部分,运行的应用程序版本与测试版本不同+1对于Marjan,我们需要查看一些代码是我添加的,请查看我的更新,并对其进行评论。
while mnuItem.Count > 0 do
      mnuItem.Items[0].Free;