2012-03-28 81 views
0

要创建并显示表单需要10秒钟,而且我想缩短处理时间。创建表单的优化

在部分是

Inherited Create(AOwner); 

哪需要2秒的总运行时间。

有没有一种方法可以缩短Delphi TForm的父创建? 或者你知道是什么的时间在通话

Inherited Create(AOwner); 

增加的原因?

更新:我没想到有18条评论和3条答案:D谢谢大家的回复。

在当前状态下,我厌倦了一些围绕此处的配置文件,而非导致代码中的实际代码行,它主要是内核调用或系统调用。

所以买随AQTime德尔福XE2后,我尝试升级项目德尔福XE2,现在需要几天的时间。(大项目)

生病添加信息,因为我得到的信息探查。

顺便说一句,在Windows服务器域之外,使得动作慢两倍。因为内部计算机在5秒钟内运行。这要好得多,但仍然很慢。

Update2:使用Delphi XE2进行编译和运行,比Delphi 2009的时间优先性提高了近20%.AQTime没有产生任何有用的信息。

update3:左边xe2,不稳定。回到2009 Delphi的构造

SendMessage(application.Handle, WM_SETREDRAW, 0, 0); 

的起点,也在构造的尽头有试图

SendMessage(application.Handle, WM_SETREDRAW, -1, 0); 
    form.Repaint; 

降低0.1秒。

+7

当我这样做时,表单即刻创建。显然你的代码和我的代码不同。我知道我的代码是干什么的,但我不知道你的代码是什么。 – 2012-03-28 15:23:43

+1

@none如果你有很多,我的意思是表单上有许多**可视化组件,你的应用程序可能需要很长时间才能创建基于* .dfm资源的表单,所以在这种情况下使用代码创建组件可以提高速度,但这会是一个矫枉过正的问题。你使用多个表单继承吗​​?一些关于你的表单的OnCreate中发生了什么的代码会有所帮助,我认为这是由于某些数据库连接保持打开状态? – ComputerSaysNo 2012-03-28 15:27:40

+0

@DorinDuminica是的,表单包含超过一百个可视化组件。 Constractor本身是巨大的,我试图孤立一个问题。 – none 2012-03-28 15:30:54

回答

9

看见滥用挤满了零部件业务形式经验:

  1. 数据库活动:你必须是活跃,并要求DB打开和/或取数据DB组件。显而易见的是,当您的表单在设计时包含DBConnections或DataSet时处于活动状态,或者,您可能会偷偷摸摸地将某些DataSources链接到某个DataSources(位于DataModule中),并将这些组件保留为活动状态,这些组件就像TDBEdit一样。
    补救措施:在设计时将所有数据集和连接设置在Active=False中,并在第一次需要时激活。事件处理程序(或者他们调用/触发其他缓慢/长时间的)组件。最经常看到的是诸如处理大型INI文件,大量XML存储或Excel电子表格等文件操作。
    补救措施:狩猎他们,并试图推迟,直到你真的需要他们。

  2. 不必要的事件处理程序调用:在创建(并经常互相调用)的事件被触发多次对没有有用的原因。使用分析器来检测和计数。
    补救措施:关闭事件直到它们有用。

不得已招:如果你不能使它更快,改变用户的感知。
将一个快速打开的启动画面放在一起看,或阅读,可以与您的MainForm开幕同时占用用户的注意力。

2

使用一个名为AQTime的分析器,并找出什么是缓慢的。这里没人能猜到你在做什么,对你来说很慢。

+0

我会那样做,谢谢。 – none 2012-04-02 15:35:30

1

我看过你有很多很多组件。所以我的猜测是,初始化所有这些组件占用的时间不是表单创建本身(通常需要几ms)。

首先:也许你已经知道这一点,但如果没有,使用一个分析器,以确定您的形式是什么成分给予延迟。是表填料只叫一次或多次..

如果大部分这些组件是控制:你应该重构代码,并为每个部分的一些帧。每当第一个零件变得可见时,您就可以及时创建所需的框架。当你有选项卡或类似的东西时,这种效果最好,当不是所有的东西都可以同时看到的时候。

如果大部分成分是不可视的,你可能会激活它们只是在时间,动态地创建他们,如果他们没有一个属性来激活/关闭它们。

如果可能的话,如果某些查询需要读取(从数据库或文件或其他)数据,试图加载在另一个线程的数据和空白表单的某些部分,直到数据是存在的。你需要的所有数据马上等等等等

但还是:最重要的是:知道什么是消耗所有的时间。