Delphi,TPopupMenuItems在应用程序闲置很长时间后表现得很奇怪

时间:2011-05-10 07:40:55

标签: delphi debugging popupmenu

我遇到了一个无法解决的问题。当然,我希望有一个建议可以帮助我找到解决方案。

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

仅在某些机器中,在让应用程序运行数天(2次或更多次)后,popupmenus不再正常工作。

行为是:

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

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

想象一下,我有正确的情况(3项 - TPopupMenu):

Item23

Item24

Item25

问题后我看到了:

的Item1

的Item1

的Item1

(其中Item1是属于另一个TPopupMenuItem的{​​{1}})。

这会告诉你什么吗?

感谢。

更新

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

TPopupMenu

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

进一步更新:

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

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

我会在我的应用程序中尝试这个(但是我需要花一些时间来确定我是否遇到了问题,不管怎么说,无论如何这都是一项重大改进。)

2 个答案:

答案 0 :(得分:1)

我确认问题与删除而不是免费相关联。 Popupmenu wsa每分钟都在有问题的机器上刷新(因此它不是OS或HW特定的,只是配置特定的)。然后根据用户设置,菜单可能有10到100个项目,因此将其闲置数天可以达到句柄限制。

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

答案 1 :(得分:0)

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