Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Разработка фоновой рутины в Delphi для безопасного выполнения задач без блокировки интерфейса пользователя

Delphi , Компоненты и Классы , Потоки

Разработка фоновой рутины в Delphi для безопасного выполнения задач без блокировки интерфейса пользователя

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

Проблема

Разработчик столкнулся с проблемой, когда фоновая рутина для выполнения задач через процедуры (Tproc) с использованием Tasks отображала экран загрузки, но иногда не закрывалась, оставаясь на экране постоянно. Также требовалось возможность перехвата возможных исключений, которые могла генерировать выполняемая задача.

Решение

В исходном коде был использован класс TLoadingClass, который содержал метод ActionAndWait для выполнения действий в фоновом режиме. Однако в коде были допущены ошибки, связанные с доступом к пользовательскому интерфейсу из фонового потока и неправильной обработкой исключений.

Исправленный ответ

Для решения проблемы необходимо синхронизировать доступ к пользовательскому интерфейсу с основным потоком. Также важно правильно обрабатывать исключения, возникающие в фоновых потоках. Исправленный код выглядит следующим образом:

class procedure TLoadingClass.ActionAndWait(Action: Tproc);
var
  LTask: ITask;
  LForm: TLoadingForm;
begin
  try
    LTask := TTask.Create(procedure
      begin
        try
          Action;
        finally
          TThread.Queue(nil,
            procedure
            begin
              LForm.Close;
            end);
        end;
      end);
    LForm := TLoadingForm.Create(nil);
    try
      try
        LTask.Start;
        LForm.ShowModal;
      finally
        TTask.WaitForAll(LTask);
      end;
    finally
      LForm.Free;
    end;
  except
    on E: EAggregateException do
      for var i := 0 to E.Count - 1 do
        ShowMessage(E.InnerExceptions[i].Message);
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;

Пример вызова:

TLoadingClass.ActionAndWait(
  procedure
  begin
    Sleep(5000);
    raise Exception.Create('Test');
  end);

Комментарии

В коде были внесены следующие изменения:

  • Удалена переменная FForm класса TLoadingClass, теперь используется локальная переменная LForm.
  • Убраны лишние попытки обработки исключений внутри фонового потока, так как это не требуется.
  • Исправлено закрытие формы: теперь достаточно вызвать Close, что автоматически спрячет форму.
  • Добавлена синхронизация вызова Close с основным потоком через TThread.Queue.
  • Добавлена обработка EAggregateException, которая позволяет перехватить все исключения, возникшие в фоновых потоках.

Заключение

Создание фоновой рутины для безопасного выполнения задач в Delphi требует внимательного отношения к синхронизации доступа к пользовательскому интерфейсу и корректной обработке исключений. Использование TThread.Queue позволяет безопасно выполнять операции с пользовательским интерфейсом из фонового потока, не блокируя основную форму.

Создано по материалам из источника по ссылке.

Описание контекста: В статье рассматривается создание фоновой рутины в Delphi для безопасного выполнения задач без блокировки интерфейса пользователя и корректной обработки исключений.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:10:18/0.0034470558166504/0