Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как создать форму в потоке?


sviat9440

Вопрос

Добрый день, столкнулся с такой проблемой...

 

Значит главная форма у меня тяжелая, поэтому я использую новую форму с надписью "инициализация" и анимированным иникатором. 

Следственно вытекает проблема: как создать форму, чтобы не "вис" анимированный индикатор?

 

Использую код:

 

uses ... main_unit;

 

procedure TLoader.Create(Sender: TObject);

Begin

   TMainForm.Create(Application);

   Loader.Hide;

End;

 

(но тогда он виснет).

Когда пробую с потоком, то форма, может создается, может нет - не знаю. Она на экран не выводится даже с методом Show, при нажатии на отдельную кнопку, после создания формы. Сам поток работает, форма не появляется на экране.

 
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Сам пытался простой код в потоке выполнять, у меня то программа вываливается. То ошибки не понятные какие-то. Что-то с потоками совсем ерунда какая-то в FMX.

Ссылка на комментарий
  • 0

то то - же! Как ни пытался применять потоки, постоянно что-то да не работает... Ладно, если нельзя создать форму в потоке, то можно ли отрисовывать анимированный индикатор в потоке? 

Ссылка на комментарий
  • 0

Скорее всего на строке:

procedure TLoader.Create(Sender: TObject);

Begin

   TMainForm.Create(Application);  // <-- Вот тут

   Loader.Hide;

End;

 

программа "занимается" созданием главной формы, "забывая" о других задачах, как то обновление аниматора. Хотя это тоже странно, ведь, на сколько я знаю, аниматоры работаю в отдельном потоке...

Ссылка на комментарий
  • 0
  • Модераторы

я обычно делаю аниматор с окном так:

создаю поток, обычно использую TidThreadComponent (Indy) 

события OnBeforeRun - анимацию показываю (обычно это не форма а Layout с компонентами и значком анимации)

OnRun - код который выполняется в отдельном потоке

OnTerminate - скрывает Layout и выключает анимацию

Ссылка на комментарий
  • 0

У меня собственный индикатор, состоит из трех обьектов: панель, картинка(логотип), Дуга(Вращается вокруг логотипа с помощью флоат анимации). Вся проблема состоит в том, что форма создается, но не может быть выведена на экран методом Show

Ссылка на комментарий
  • 0

я обычно делаю аниматор с окном так:

создаю поток, обычно использую TidThreadComponent (Indy) 

события OnBeforeRun - анимацию показываю (обычно это не форма а Layout с компонентами и значком анимации)

OnRun - код который выполняется в отдельном потоке

OnTerminate - скрывает Layout и выключает анимацию

С этим компонентом - та же проблема...

Если я выполняю в обычном режиме:

TMainForm.Create(Application);

то форма создается и открывается автоматически.

 
Если я выполняю в потоке, то форма (незнаю создается или нет вообще) не появляется на экране, даже при клике на кнопку после создания формы. Визуально ошибок не выдает, только в отладке ругается (на что - так-же конкретно неизвестно).
Ссылка на комментарий
  • 0

У меня вообще с потоками какаято ерунда. Ошибки с пустого места.

 

Это ошибка: 

 

var

   ...

   MyThread: TMyThread;

 

TMyThread - Показывает что это неизвестный идентификатор...

Ссылка на комментарий
  • 0
  • Модераторы

TMyThread - это что? Если это класс наследник от TThread, то почему в вашем коде он не объявлен?

В общем весь код в студию...

 

Выше, Xenon54, дал вам ссылку, пробовали?

Ссылка на комментарий
  • 0

Да, пробовал. 

 

Ругается на :

 

var 

...

   MyTask: TMyTask;

 

Ну и соответственно на все остальные действия связанные с TMyTask.

Изменено пользователем sviat
Ссылка на комментарий
  • 0

О, нашел ошибку. В type я писал MyThread, тогда как надо было TMyThread. Все заработало, но проблема остается проблемой - форма (неизвестно создается или нет) не появляется на экране даже прингудительно.

Ссылка на комментарий
  • 0
unit load_unit;


interface


uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, main, loader_unit,
  FMX.StdCtrls, FMX.Ani, FMX.Objects, FMX.Controls.Presentation,
  IdThreadComponent, IdBaseComponent;


type
  Tload = class(TForm)
    Light: TStyleBook;
    Panel9: TPanel;
    Image1: TImage;
    Arc1: TArc;
    FloatAnimation1: TFloatAnimation;
    Img1: TFloatAnimation;
    Label1: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
  public
  end;


type
  TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;


var
  load: Tload;
  MyThread: TMyThread;


implementation


{$R *.fmx}


procedure Tload.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=false;
  Application.FormFactor.Orientations := [TFormOrientation.Landscape, TFormOrientation.InvertedLandscape];
  Timer2.Enabled:=true;
end;


procedure Tload.Timer2Timer(Sender: TObject);
begin
  Timer2.Enabled:=false;
  MyThread:= TMyThread.Create(false);
end;


{ TMyThread }


procedure TMyThread.Execute;
begin
  with TMain_page.Create(Application) do
  Begin
    Show;
    load.Hide;
  End;
  inherited;
end;


end.
 
 
При выполнении этого кода НИКАКИХ проблем в отладке не возникает. В диспетчере задач видно что на 20 мб обьем используемой ОЗУ увеличилось. Но форма не появляется на экране.
Изменено пользователем Andrey Yefimov
Ссылка на комментарий
  • 0

   Нужно знать, что метод Synchronize выполняется в главном потоке приложения. Поэтому, работая с несколькими потоками в приложении и применяя метод Synchronize, нужно учитывать, что:

  • во-первых, частый вызов Synchronize тормозит выполнение приложения;
  • во-вторых, если практически все процедуры выполняющегося потока выполняются с использованием метода Synchronize, то смысла в создании такого потока нет - всё равно его работа пройдёт в главном потоке.

А мне не нужно чтобы приложение тормозило...

Ссылка на комментарий
  • 0

 

   Нужно знать, что метод Synchronize выполняется в главном потоке приложения. Поэтому, работая с несколькими потоками в приложении и применяя метод Synchronize, нужно учитывать, что:

  • во-первых, частый вызов Synchronize тормозит выполнение приложения;
  • во-вторых, если практически все процедуры выполняющегося потока выполняются с использованием метода Synchronize, то смысла в создании такого потока нет - всё равно его работа пройдёт в главном потоке.

А мне не нужно чтобы приложение тормозило...

 

Форма запускается, НО при создании ее приложение виснет так, как мы могли бы ее создать вне потока. Толку от потока в таком случае = 0.

Ссылка на комментарий
  • 0

 

 

   Нужно знать, что метод Synchronize выполняется в главном потоке приложения. Поэтому, работая с несколькими потоками в приложении и применяя метод Synchronize, нужно учитывать, что:

  • во-первых, частый вызов Synchronize тормозит выполнение приложения;
  • во-вторых, если практически все процедуры выполняющегося потока выполняются с использованием метода Synchronize, то смысла в создании такого потока нет - всё равно его работа пройдёт в главном потоке.

А мне не нужно чтобы приложение тормозило...

 

Форма запускается, НО при создании ее приложение виснет так, как мы могли бы ее создать вне потока. Толку от потока в таком случае = 0.

 

Создавать поток только для создания и показа формы не комильфо.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0
На вашем примере все работает, НО в моем проекте, форма не появляется на экране, а форма загрузки изчезает.
 
procedure Tload.Timer2Timer(Sender: TObject);
begin
  Timer2.Enabled:=false;
  Timer3.Enabled:=true;
  ld:= Loader.Create(true);
  ld.Start;
end;
 
procedure Tload.Timer3Timer(Sender: TObject);
begin
  if ld.Finished then
  begin
    Timer3.Enabled:=false;
    Main_page.Show;  // По идее должна появляться главная форма (не работает)
    load.Hide;  // форма загрузки исчезает (работает)
  end;
end;
 
{ Loader }
 
 
constructor Loader.Create(susp: boolean);
begin
  inherited Create(susp);
end;
 
procedure Loader.Execute;
begin
  main_page:= Tmain_page.Create(Application);
  main_page.Parent:= load;
  sleep(5000);
end;
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...