[我想知道是否有可能在后台线程中创建UI元素,甚至是完整的表单(“当然不使用它”,一旦完成,使其在主线程中可用以显示它。
现在在后台线程中分离耗时的数据操作并将结果与您的主线程同步相对容易,但是如果创建UI本身就是耗时的操作呢?
[如果可能,您可能会有一个快速启动屏幕,然后启动后台线程来创建一组表单。只要准备就绪,它就会在主线程中启用菜单项,以便可以使用它。
我尝试了简单的代码,但是它立即冻结。有可能吗?
在主程序中执行:
...
// declare var in main form
public
{ Public declarations }
lForm : TForm ;
...
// Execute e.g. with button click in main form
TThread.CreateAnonymousThread( procedure begin
// this stops application from running when the form is show
// in the synchronize part
lForm := TForm1.Create(Self);
TThread.Synchronize(nil,
procedure begin
// This does not stops the application but freezes the gui of course
//lForm := TForm1.Create(Self);
lForm.Parent := Self ;
lForm.Show ;
end );
end ).Start ;`
procedure TForm1.FormCreate(Sender: TObject);
begin
sleep(2000);
end;
...
如果不可能,如何在仍然“模拟”您的主线程响应的同时在主线程中执行此操作? (通过定期调用诸如application.processmessages之类的东西?)
我正在使用Delphi Rio 10.3,fmx框架。
我想知道是否可以创建UI元素,甚至是完整的形式,在后台线程中(“当然不使用它”),以及完成后,使其在主线程中可用以显示。
从后台线程创建和访问UI控件不是线程安全的。
虽然您可以创建看似可行的概念证明代码,但此类代码天生就被破坏了。它可能会随机失败。
因此,总而言之,UI控件只能在创建它们的线程中安全使用,并且您无法在创建时间之后更改此行为(并使它们“属于”另一个线程,就好像它们是在其中创建的一样)首先))。
虽然从概念上讲,创建不与其他人交互的表单可以How to make a form in a DLL embedded inside my application?我在这里假设表单的确是在不同的线程中创建的,甚至可能是在不同的进程中创建的,对吧?
我发现以下内容不会立即冻结,但是如果现在还是运气纯真的话,我不确定。相反,如果使表单在后台线程的同步部分中可见,我会在主线程中“确实”执行此操作...