9

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

FApplication.CreateForm (TfrmXXX, frmXXX) 

frmXXX := TFrmXXX.Create(FApplication)

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

提前致谢。

4

8 回答 8

26

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

通常,在您分析并确切知道问题所在之前,不可能很好地提高一段代码的性能。否则,你只是在浪费时间。

于 2009-02-03T16:49:56.407 回答
6

解决方案并不容易,因为

  1. Delphi VCL 不是线程安全的
  2. 在另一个线程中创建窗口需要相应的线程有一个消息循环

你需要一次所有的表格吗?如果没有,您可以将创建推迟到应用程序空闲的时间(即 TApplicationEvents.OnIdle)。或者只是显示一个漂亮的进度条:)

于 2009-02-03T16:51:08.633 回答
4

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

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

于 2009-02-03T22:26:59.067 回答
1

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

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

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

于 2009-02-04T10:29:04.507 回答
1

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

Jens Fudge,Archersoft

于 2009-03-20T09:56:49.233 回答
0

我无法想象需要线程来解决的表单创建需要这么长时间。如果数据量很大,请尝试限制最初显示的数量。

于 2009-02-03T21:59:23.957 回答
0

这是我们之前使用的快捷方式,用于在创建时需要执行大量流程的表单。在表单上放置一个 TTimer 并将其设置为 false。表单的 OnCreate 启用它。然后将您在 OnCreate 中的所有代码放入 OnTimer 事件中。将间隔设置为 250 到 500 就足够了。

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

于 2009-02-04T03:32:07.077 回答
0

正如我之前所说,有一些大表格。DFM 文件大小为 3mb(当然包括图像数据)。我实际上认为大部分的创建时间是由于那个而不是执行的代码。但是可能会在应用程序空闲时拆分 em 并创建它们,当前的加载时间并不是很大(比如 4 或 5 秒),但我会仔细研究它。感谢您的回复。

于 2009-02-04T10:06:37.563 回答