В современном программировании одним из ключевых факторов успеха приложения является его производительность и удобство использования. Одним из способов улучшить эти показатели является использование фоновых потоков для выполнения длительных операций, таких как обращение к веб-API. В данной статье мы рассмотрим, как можно эффективно передавать данные из фоновых потоков в основное приложение на примере языка Object Pascal в среде Delphi.
Проблема
Пользователь столкнулся с проблемой передачи данных из фонового потока в основное приложение. Была разработана единица TCAPI_ThreadLib для работы с потоками, но возникла необходимость передать результат выполнения потока в основное приложение для дальнейшей обработки.
Решение
Для решения проблемы пользователь нашел решение с использованием обратных вызовов (callbacks). Это позволило ему сохранить код потока в отдельной единице, не копируя его в основную форму приложения. В результате, был изменен класс TTCAPI_GetJson_Thread, добавив параметр CallBack, который является процедурой, вызываемой при завершении потока. Эта процедура получает данные, полученные из веб-API, и передает их в основное приложение.
Вот пример измененного кода класса TTCAPI_GetJson_Thread:
unit TCAPI_ThreadLib;
interface
uses
FMX.Types, FMX.Objects, IdHTTP, System.Classes;
type
TDataCallback = Procedure(const SJson: String) of Object;
TTCAPI_GetJson_Thread = class(TThread)
...
private
FDataProc: TDataCallback;
procedure DoCallback;
...
public
constructor Create(SEmail, SApiID, SAPIPassword: String; CallBack: TDataCallback); overload;
...
end;
...
implementation
...
procedure TTCAPI_GetJson_Thread.DoCallback;
begin
if Assigned(FDataProc) then FDataProc(FApiDataResult);
end;
...
constructor TTCAPI_GetJson_Thread.Create(SEmail, SApiID, SAPIPassword: String; CallBack: TDataCallback);
begin
inherited Create(True);
...
FDataProc := CallBack;
end;
...
procedure TTCAPI_GetJson_Thread.Execute;
begin
...
Synchronize(DoCallback);
end;
...
end.
Также, в основном приложении, была добавлена процедура DataCallback, которая обрабатывает полученные данные:
procedure TForm1.DataCallback(const S: String);
begin
// Здесь можно выполнить необходимую обработку данных
ShowMessage(S);
end;
Использование этой процедуры в основном приложении осуществляется следующим образом:
procedure TForm1.Button2Click(Sender: TObject);
var
DataThread: TTCAPI_GetJson_Thread;
begin
With TTCAPI_GetJson_Thread.Create('email@example.com', 'apiid', 'password', DataCallback) do
begin
FreeOnTerminate := True;
Start;
end;
end;
Преимущества использования callback
Использование callback позволяет:
Отделить логику потока от основного приложения: код потока может быть использован в разных приложениях без необходимости изменения.
Улучшить пользовательский интерфейс (UX): фоновые потоки не блокируют основной поток приложения, что позволяет сохранять отзывчивость интерфейса.
Повысить модульность: легко заменять или расширять функционал без изменения основного кода приложения.
Заключение
Применение обратных вызовов в фоновых потоках является эффективным способом передачи данных между потоком и основным приложением. Это позволяет улучшить пользовательский интерфейс и повысить производительность приложения, делая его более конкурентоспособным на рынке.
В статье рассматривается оптимизация передачи данных из фоновых потоков в приложение на Delphi через использование обратных вызовов, что улучшает UX при работе с веб-API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS