• 0
Ivan B.

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

Вопросы

Всем привет.

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

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

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

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

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

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


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

7 ответов на этот вопрос

  • 0

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

 

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


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

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

 

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

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


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

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

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

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

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

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

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


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

Спасибо за пояснения, я тоже привык описывать 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.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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