Delphi表单创建没有冻结主线程

时间:2009-02-03 16:38:42

标签: multithreading delphi forms vcl

我遇到了一些我想做的事情。我有一些很大的形式,需要一些时间来创建。为了使应用程序加载速度更快,我想让表单在主窗体的OnCreate事件中创建的线程中创建。该线程有一个TApplication类型的FApplication字段,它显然是Application变量。我用它来创建线程上的表单,但即使我尝试了

FApplication.CreateForm (TfrmXXX, frmXXX) 

frmXXX := TFrmXXX.Create(FApplication)

表单仍未创建。这有什么解决方法吗?

提前致谢。

8 个答案:

答案 0 :(得分:26)

在线程中创建表单根本不起作用。 VCL,尤其是可视部分,不是线程安全的。放弃这个想法,而是优化导致表单需要很长时间才能创建的代码。你还没有告诉我们缓慢的部分是什么。如果你能回答这个问题,也许我们可以建议一种加快速度的方法。

通常,在对其进行分析并确切知道问题所在之前,不可能很好地改进代码的性能。否则,你只是在浪费时间。

答案 1 :(得分:6)

解决方案并不容易,因为

  1. Delphi VCL不是线程安全的
  2. 在另一个中创建窗口 线程需要各自的 线程有消息循环
  3. 您是否一次需要所有表格?如果没有,您可以将创建推迟到应用程序空闲的时间(即TApplicationEvents.OnIdle)。或者只显示一个不错的进度条:)

答案 2 :(得分:4)

Riho指出,表单创建不应占用时间。可能需要花费时间的是,您在构造函数中放入的所有代码或该表单的OnCreate事件。

像Craig建议的那样对代码进行概要分析,以便您知道哪些代码占用的时间最多。然后看看你是否可以将一些代码移动到一个单独的线程中。

答案 3 :(得分:1)

如上所述,您必须在VCL线程中创建表单。但是,你不需要在那里做任何事情:

如果您的表单包含大量图像数据,您可以从表单中删除它,并将其放在资源文件中(或只使用原始图像文件)

在表单的构造函数中,启动后台线程以从资源中读取图像数据并执行任何其他缓慢的操作。覆盖表单OnShow事件,以确保在显示表单之前等待后台线程完成。

答案 4 :(得分:1)

只需在表单OnCreate上放置一个PostMessage,然后在表单上使用一个过程来处理postmessage。 这样,所有需要时间的代码都可以从OnCreate方法中推出。 我确实同意,只有在需要时才创建表单,然后确实实现了一些逻辑来决定你是否会在关闭时释放它。取决于加载时间和用户再次想要它的机会..

Jens Fudge,Archersoft

答案 5 :(得分:0)

我无法想象在需要线程解决的表单创建中会花费多长时间。 如果是大量数据,则尝试限制最初显示的数量。

答案 6 :(得分:0)

这是我们以前用于创建有大量进程的表单的快捷方式。在表单上删除TTimer并将其设置为false。表单的OnCreate启用它。然后将OnCreate中的所有代码放入OnTimer事件中。将间隔设置为250到500就足够了。

这不是一个优雅的解决方案,但它很简单。

答案 7 :(得分:0)

如前所述,有一些大型表格。 DFM文件就像3mb(当然包括图像数据)。 我实际上认为大部分创建时间都是由于而不是执行的代码。 但也许是错误的分裂em并在应用程序空闲时创建它们,当前的加载时间不是很大(比如4或5秒)但看起来很糟糕。谢谢你的回复。

相关问题