【问题标题】:Delphi: Problems with TList of FramesDelphi:TList of Frames 的问题
【发布时间】:2011-01-10 16:30:56
【问题描述】:

我在使用由 TScrollBox 内的多个帧(通常为 25 个)组成的界面时遇到问题。

有 2 个问题,我希望其中一个是另一个的结果...

背景:

当应用程序启动时,我创建了 25 个帧,每个帧包含大约 25 个帧。 20 个控件,然后填充默认信息。然后,用户可以单击控件以将搜索限制为信息子集,此时我释放并重新创建我的框架(因为搜索可能返回

问题:

如果我在初始搜索后退出应用程序,则大约需要 10 分钟。 5秒返回Delphi。在第二次搜索(并处理/重新创建帧)之后,大约需要。 20 秒)

虽然我可以重写应用程序以仅创建一次框架,但我想了解发生了什么。

这是我的创建例程:

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer);
var
   NewFrame: TSF;
begin
   NewFrame := TSF.Create(Self);
   NewFrame.Name := 'SF' + IntToStr(i);
   if i = 0 then
      NewSF.Top := 8
   else
      NewSF.Top := FrameBottom + 8;
   FrameBottom := NewFrame.Top + NewFrame.Height;
   NewFrame.Parent := ScrollBox1;
   FrameList.Add(NewFrame);
end;

这是我的删除例程:

procedure TMF.ClearFrames;
var
   i: Integer;
   SF: TSF;
begin
   for i := 0 to MF.FrameList.Count -1  do
   begin
      SF := FrameList[i];
      SF.Free;
   end;
   FrameList.Clear;
end;

我错过了什么?

【问题讨论】:

  • FrameList 是什么类型的?顺便说一句,在 ClearFrames 中,您指的是 for 循环内的 MF.Framelist 。这里看起来不正确。
  • Framelist 是在 TMF 主窗体的 Public 部分中声明的 TList。 ClearFrames 中的 MF 是无关紧要的,但它本身不应该引起任何问题吗?更多腰带和牙套...

标签: delphi frames tlist


【解决方案1】:

由于您通过释放它们来控制正在创建的 Frames 的内存分配,因此无需在 create 构造函数中提供 Self 作为 owner 参数。改为传递 nil 以防止所有者尝试释放框架。

另外,不喜欢您的 ClearFrames 例程的外观。试试这个:

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;

【讨论】:

  • 感谢您的建议。切换到 Owner (nil) 及以上,跑一两次后退出还有 10 秒的差距……
  • 您是否使用过 FastMM 完全调试模式来检查内存泄漏?这可能指向一个问题,而这又可能是更进一步的问题的根本原因。您可能会说这发生在我身上,它导致退出调试会话时延迟约 10 秒。
【解决方案2】:

如果您想知道为什么您的应用需要这么长时间才能完成某件事,请尝试对其进行分析。尝试对您的程序运行Sampling Profiler。帮助文件解释了如何将分析限制在应用程序的特定部分,您可以使用它来仅获取有关清除或创建部分的采样结果。这应该会向您展示您实际上将大部分时间花在了哪些地方,并且无需进行大量猜测。

【讨论】:

  • 一个非常快速和肮脏的分析替代方案是在调试器下运行,当长时间运行的操作发生时,中断执行、暂停执行或任何调用。你这样做了几次,它就像穷人的采样分析器。如果有什么东西无缘无故地消耗 CPU (甚至没有充分的理由!),那么你通常会闯入它的中间并意识到这一点。
  • @David:是的,但是由于 Sampling Profiler 是免费的,而且易于学习和使用,所以没有太多理由更喜欢 IMO 的“调试器暂停分析”方法。
  • 当我尝试它时无法让它工作,但我想我并没有太努力。我同意适当的工具值得拥有,但“调试器暂停分析”方法通常可以在几秒钟内工作。无论如何,这只是另一种选择。
  • 我似乎无法让 Sampling Profiler 工作 - 我在尝试开始分析时遇到(法语)访问冲突...
猜你喜欢
  • 2019-04-07
  • 2019-09-24
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2011-04-07
相关资源
最近更新 更多