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

[TAniIndicator] Почему замораживается TAniIndicator при выполнении запроса к базе данных?


ivadimos

Вопрос

Опубликовано

Запускаю отрисовку компонентов, данные для которых берутся из базы - занимает некоторый промежуток времени(1-3сек).
В это время я запускаю анимацию компонента aniIndicator, однако он не крутится. Проблема в неправильном использовании потоков.

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

  • 0
  • Администраторы
Опубликовано

Индикатор не будет крутиться, Так как вы блокируете основной поток своей работой с БД. Решение дано в теме:

  • 0
Опубликовано

данные загружаются в отдельном потоке?

 

Btn := (Sender as TConfirmButton);

  TThread.Synchronize(nil, procedure
  begin
    ShowLoad;
  end);

  TTask.Run(
  procedure
  begin
    TThread.Synchronize(nil, procedure
    begin
      case Btn.Id of
        BACK_TO_MENU_TYPES: Self.ShowMenuTypes;
        BACK_TO_MENU: Self.LoadMenu(Global.CURRENT_MENU);
        BACK_TO_PREV_FOLDER: Self.OpenMenuFolder(Btn.OpenFolder);
        OPEN_MENU: Self.LoadMenu(Btn.OpenFolder);
        OPEN_FOLDER: Self.OpenMenuFolder(Btn.OpenFolder);
        OPEN_TRADE_POSITION: Self.OpenTradePosition(Btn);
      end;
    end);

    TThread.Synchronize(nil, procedure
    begin
      HideLoad;
    end);
  end);

ShowLoad, HideLoad - изменяю visible layout'a с индикатором.

Внутри процедур потоков нет. 

 

  • 0
  • Модераторы
Опубликовано
ShowLoad;

TTask.Run(
  procedure
  begin
    case Btn.Id of
      BACK_TO_MENU_TYPES: Self.ShowMenuTypes;
      BACK_TO_MENU: Self.LoadMenu(Global.CURRENT_MENU);
      BACK_TO_PREV_FOLDER: Self.OpenMenuFolder(Btn.OpenFolder);
      OPEN_MENU: Self.LoadMenu(Btn.OpenFolder);
      OPEN_FOLDER: Self.OpenMenuFolder(Btn.OpenFolder);
      OPEN_TRADE_POSITION: Self.OpenTradePosition(Btn);
    end;

    TThread.Synchronize(nil, procedure
      begin
        // тут разбираем даные пришедшие с БД
        HideLoad;
      end);
end);

я правда не понимаю что происходит в этих процедурах, но там должно быть только получение данных. т.е. выполниться сам запрос в БД.

а отрисовка/работа с визуальными компонентами должна произойти в этом блоке

    TThread.Synchronize(nil, procedure
      begin
        // тут разбираем даные пришедшие с БД
        HideLoad;
      end);
  • 0
Опубликовано

synchronize - это выполнение в главном потоке

если вы выполняете доп. поток, а в нем все внутри Synchronize - то можно и поток не заводить

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...