1

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

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

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

行为是:

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

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

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

第 23 项

第 24 项

第 25 项

问题后我看到:

项目1

项目1

项目1

(其中 Item1TPopupMenuItem属于另一个TPopupMenu)。

这是否告诉你一些事情?

谢谢。

更新:

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

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

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

进一步更新:

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

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

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

4

2 回答 2

1

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

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

于 2011-05-12T09:41:50.017 回答
0

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

于 2011-05-10T07:56:30.617 回答