(Delphi fmx)是否可以在后台线程中创建UI控件而不阻塞用户界面

问题描述 投票:-1回答:3

[我想知道是否有可能在后台线程中创建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框架。

multithreading user-interface delphi firemonkey
3个回答
2
投票

我想知道是否可以创建UI元素,甚至是完整的形式,在后台线程中(“当然不使用它”),以及完成后,使其在主线程中可用以显示。

NO。

从后台线程创建和访问UI控件不是线程安全的。

虽然您可以创建看似可行的概念证明代码,但此类代码天生就被破坏了。它可能会随机失败。


0
投票

因此,总而言之,UI控件只能在创建它们的线程中安全使用,并且您无法在创建时间之后更改此行为(并使它们“属于”另一个线程,就好像它们是在其中创建的一样)首先))。

虽然从概念上讲,创建不与其他人交互的表单可以How to make a form in a DLL embedded inside my application?我在这里假设表单的确是在不同的线程中创建的,甚至可能是在不同的进程中创建的,对吧?


-2
投票

我发现以下内容不会立即冻结,但是如果现在还是运气纯真的话,我不确定。相反,如果使表单在后台线程的同步部分中可见,我会在主线程中“确实”执行此操作...

© www.soinside.com 2019 - 2024. All rights reserved.