我遇到了一些我想做的事情。我有一些很大的形式,需要一些时间来创建。为了使应用程序加载速度更快,我想让表单在主窗体的OnCreate事件中创建的线程中创建。该线程有一个TApplication类型的FApplication字段,它显然是Application变量。我用它来创建线程上的表单,但即使我尝试了
FApplication.CreateForm (TfrmXXX, frmXXX)
和
frmXXX := TFrmXXX.Create(FApplication)
表单仍未创建。这有什么解决方法吗?
提前致谢。
答案 0 :(得分:26)
在线程中创建表单根本不起作用。 VCL,尤其是可视部分,不是线程安全的。放弃这个想法,而是优化导致表单需要很长时间才能创建的代码。你还没有告诉我们缓慢的部分是什么。如果你能回答这个问题,也许我们可以建议一种加快速度的方法。
通常,在对其进行分析并确切知道问题所在之前,不可能很好地改进代码的性能。否则,你只是在浪费时间。
答案 1 :(得分:6)
解决方案并不容易,因为
您是否一次需要所有表格?如果没有,您可以将创建推迟到应用程序空闲的时间(即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)