Мне интересно, возможно ли создать элементы пользовательского интерфейса, даже полную форму, в фоновом потоке («конечно, без его использования»), и как только это будет сделано, сделайте его доступным для отображения в главном потоке.
Теперь относительно легко отделить трудоемкие операции с данными в фоновых потоках и синхронизировать результаты с основным потоком, но что, если создание самого пользовательского интерфейса является трудоемкой операцией?
Если возможно, у вас может быть быстрый экран запуска, а затем запуск фонового потока для создания набора форм. Всякий раз, когда кто-то готов, он включает пункт меню в главном потоке, чтобы его можно было использовать.
Я пробовал простой код, но он сразу же зависает. Возможно ли это?
Выполнить в основной программе:
...
// 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 framework.