Перейти к содержанию
  • Регистрация
  • 0
Ivan B.

Индикатор замирает во время создания объектов в ScrollBox'е

Вопрос

Всем привет.

Как правильно пользоваться индикатором?

В событии пишу Indicator.Enabled:=True и дальше процедуру, в которой в скроллбоксе создаются объекты.

Индикатор появляется только после прорисовки в скроллбоксе. Если его, к примеру, запустить из Timer'a, то он начинает анимацию и замирает, пока идет прорисовка объектов.

Подскажите, пожалуйста, правильную реализацию отображения индикации процесса выполнения задач.

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

Дело в том, что индикатор отрисовывается в основном потоке. По видимому ваша процедура также выполняется в основном потоке. Чтобы не было подтормаживаний, выполняйте фоновые операции в отдельном потоке, а при необходимости отрисовать какой-нибудь визуальный компонент, пользуйтесь Synchronize или Queue.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
35 минут назад, Alex7wrt сказал:

Дело в том, что индикатор отрисовывается в основном потоке. По видимому ваша процедура также выполняется в основном потоке. Чтобы не было подтормаживаний, выполняйте фоновые операции в отдельном потоке, а при необходимости отрисовать какой-нибудь визуальный компонент, пользуйтесь Synchronize или Queue.

 

Alex, а как лучше организовать многопоточность? Создать класс TThread или использовать iTask?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

По моему, все равно.  Как вам удобнее.

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

TTask также удобен тем, что его можно сразу использовать, не нужно объявлять поток.

TThread удобен, если нужно выполнить определенный набор действий по завершению потока (с помошью OnTerminate). Может и в TTask такое есть, не знаю

Лично я просто привык использовать TThread 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.07.2018 в 21:22, Ivan B. сказал:

Alex, а как лучше организовать многопоточность? Создать класс TThread или использовать iTask?

Лучше не наследоваться в отдельный класс от TThread, как это делалось раньше в Delphi.

Это громоздкий и запутанный код. 

Лучше используйте анонимные потоки. Вот вам шаблон:

 

http://blog.marcocantu.com/blog/2014_may_background_delphi_android_threads.html

TThread.CreateAnonymousThread(
    procedure
    begin

 // выполняется в потоке

      TThread.Queue(nil,
        procedure
        begin

  /// выполняется в главном потоке, когда завершиться анонимный поток.

        end);
    end
  ).Start;

procedure TForm5.Button3Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure ()
  begin
         // выполняется в потоке
        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin

 // выполняется в главном потоке, но при этом анонимный поток еще продолжит работать, но сейчас приостановлен

          end);

  end).Start;
end;


И помните что с элементами GUI нельзя работать из другого потока, только из главного ( TThread.Queue,  TThread.Synchronize). Иначе будет Access Violation, который будет выскакивать случайным образом.

Изменено пользователем ENERGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Это для совсем простеньких случаев, когда классу потока не нужны поля, методы и все такое. TTask.Run ничем не отличается от этого

А для более продуманных вещей потомки TThread по-прежнему рулят

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Всем спасибо за ответы, но мне понадобилось передавать в класс потока переменные, описать несколько методов для потока, я не знаю как мне это сделать в анонимном потоке - воспользуюсь TThread.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


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

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

×
×
  • Создать...