5

我有一个 D2006 应用程序,它在选项卡上包含页面控件和各种网格等。当我调整主表单的大小时(它会波及并调整表单上与某物对齐的几乎所有内容),我会遇到很长的延迟,比如几秒钟。应用程序冻结,未调用空闲处理程序,并且正在运行的线程似乎也暂停。

我尝试在发生这种情况时暂停 IDE 中的执行,以尝试在麻烦的代码中中断执行,但 IDE 不接收消息。

显然,我不希望有人指出一些错误的代码,但我正在调试可能对我有帮助的方法。我在整个应用程序中都有大量的执行时间代码,并且长时间的延迟不会出现在任何数据中。例如,主窗体 OnResize 处理程序的执行时间最短。

4

4 回答 4

5

如果您想了解实际占用您时间的内容,请尝试使用分析器。 Sampling Profiler可以很容易地回答您的问题,特别是如果您能够找到导致问题的代码部分的开头和结尾并OutputDebugString在其周围插入语句以缩小分析范围。

于 2011-03-02T19:49:15.517 回答
3

好的。问题解决了。我注意到只有在启用命令行开关以记录一些调试信息时才会出现问题。调试信息包括一些 HTTP 响应,这些响应写入其中一个选项卡上的调试日志(TMemo)。当 HTTP 响应包含一个没有 CR/LF 的大块时,TMemo 会包装它。每当我调整主窗体的大小时,TMemo 都会调整大小,并且控件必须使用新的自动换行再次呈现文本。

展示:

  • 开始一个新的 Delphi 项目
  • 将 TMemo 拖放到表单上
  • 将其与客户对齐
  • 编译运行
  • 将大量文本粘贴到 TMemo 中
  • 调整主窗体的大小

我不会给自己答案,因为我并没有真正为其他人提供足够的信息来解决它。

顺便说一句@Mason - SamplingProfiler 会选择这个 - 考虑到执行是在 VCL 内部,而不是在我的代码中?

于 2011-03-03T00:08:40.510 回答
2

一种可能会产生结果的蛮力方法.... 从每个 re-size 事件中将调试消息发送到 OutputDebugString(),将控件的名称作为要显示的字符串发送。这可能会告诉你哪些被称为“很多”。

您可能会遇到控件相互碰撞的情况,从而引发级联的调整大小事件。就像紧凑型汽车后座的 3 个兄弟姐妹一样,一旦他们开始争夺位置,他们可能需要一段时间才能“安顿下来”。

不要让我把这辆车转过来......

调试日志(可在 IDE 中查看,或使用外部 ODS 查看器查看)可能会向您显示哪些是造成最大问题的,如果它们针对一个“用户启动的调整大小事件”多次出现。

于 2011-03-02T21:47:32.340 回答
2

在 AQTime 的性能分析器中运行您的应用程序(包含在 XE 中,但您可以从他们的网站获得限时版本)。

做一些狂热的调整大小,然后停止应用程序。

之后,您将确切地看到哪个函数被调用了很多次,以及大部分时间都花在了哪里。

于 2011-03-02T23:58:44.757 回答