Разработка приложений для iOS с использованием Delphi XE5 требует особого внимания к многопоточности, особенно когда речь идет об анимации элементов пользовательского интерфейса. В данной статье мы рассмотрим, как правильно организовать работу фоновых потоков таким образом, чтобы анимация индикатора загрузки (spinner) осуществлялась корректно и без задержек.
Проблема
Разработчик столкнулся с проблемой, когда при выполнении фоновой работы (SQL-запроса) не удавалось корректно анимировать индикатор загрузки. Использование Application.ProcessMessages() не приводило к ожидаемому результату, и анимация индикатора либо не отображалась вовсе, либо происходила с задержками.
Решение
Для решения проблемы разработчик должен следовать нескольким ключевым шагам:
Включить анимацию индикатора загрузки перед запуском фонового потока.
Определить метод OnTerminate для потока, который будет отвечать за отключение анимации загрузки после завершения работы потока.
Выполнить необходимую работу в потоке, а метод OnTerminate автоматически отключит индикатор загрузки, как только работа будет завершена.
Также стоит отметить, что нет необходимости явно освобождать поток, если установлено свойство FreeOnTerminate в True.
begin
if btnLogin.Text = 'Login' then begin
Form_Login.LoadSpinnerFrame.Visible := True;
Form_Login.LoadSpinner.Visible := True;
Form_Login.LoadSpinner.Enabled := True;
btnLogin.Enabled := False;
aThread := TMyThread.Create(False);
aThread.FreeOnTerminate := True;
aThread.OnTerminate := Self.WorkIsDone;
aThread.Start;
end
else begin
btnLogin.Text := 'Login';
end;
end;
procedure TYourForm.WorkIsDone(Sender: TObject);
begin
Form_Login.LoadSpinnerFrame.Visible := False;
Form_Login.LoadSpinner.Visible := False;
Form_Login.LoadSpinner.Enabled := False;
btnLogin.Text := 'Logout';
btnLogin.Enabled := True;
end;
procedure TMyThread.Execute;
begin
// Здесь выполняется работа, например, SQL-запрос
end;
Важные замечания
Программный поток в Delphi управляется событиями. Необходимо избегать опроса состояния потока, так как это может привести к перегрузке CPU и не отзывчивости GUI.
Заключение
Необходимо помнить, что для XE5 существует ошибка, которая может вызвать зависание потоков при вызове OnTerminate, особенно если активен индикатор загрузки. Это затруднение действует только для iOS и имеет номер ошибки QC#117582. На данный момент не известно ни одного рабочего способа устранения этой проблемы, кроме как не показывать индикатор загрузки во время выполнения работы в фоновом потоке.
Рассмотрение правильной реализации анимации индикатора загрузки в фоновых потоках Delphi XE5 для iOS приложений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS