Использование callback-функций для обработки завершения потоков в Delphi: нативный подход
Вопрос, поднятый пользователем, касается возможности настройки callback-функции, которая будет вызвана при завершении любого потока в программе на языке Delphi. Ответ требуется найти в контексте нативного программирования, а не .NET.
Подтвержденный ответ
В Delphi для реализации такого поведения можно использовать механизм обработчиков событий. Создадим класс TThreadHelper, который будет отвечать за мониторинг потоков. В этом классе будет храниться список всех запущенных потоков, и при их завершении будет вызвана заранее определенная пользователем функция.
unit ThreadHelper;
interface
uses
Classes, SysUtils;
type
TThreadHelper = class
private
FThreads: TList<TThread>;
FOnThreadTerminated: TThreadNotificationEvent;
procedure HandleThreadTerminated(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
property OnThreadTerminated: TThreadNotificationEvent read FOnThreadTerminated write FOnThreadTerminated;
end;
type
TThreadNotificationEvent = procedure(Sender: TThread; var Handled: Boolean) of object;
implementation
{ TThreadHelper }
constructor TThreadHelper.Create;
begin
FThreads := TList<TThread>.Create;
FThreads.OnListChange := HandleThreadTerminated;
end;
destructor TThreadHelper.Destroy;
begin
FThreads.Free;
inherited;
end;
procedure TThreadHelper.HandleThreadTerminated(Sender: TObject);
var
Thread: TThread;
Index: Integer;
begin
// Получаем индекс измененного элемента списка
Index := Sender.GetListIndex;
if Index >= 0 then
begin
Thread := FThreads[Index];
if Thread.Terminated then
begin
// Удаляем завершенный поток из списка
FThreads.Delete(Index);
// Вызываем обработчик событий
if Assigned(FOnThreadTerminated) then
FOnThreadTerminated(Sender, var Handled);
end;
end;
end;
{ TThreadNotificationEvent }
end.
Использование TThreadHelper в вашем приложении:
var
ThreadHelper: TThreadHelper;
begin
ThreadHelper := TThreadHelper.Create;
try
// Установка обработчика событий для отслеживания завершения потоков
ThreadHelper.OnThreadTerminated := ThreadTerminatedCallback;
// Создание и запуск потоков...
finally
ThreadHelper.Free;
end;
end;
procedure ThreadTerminatedCallback(Sender: TThread; var Handled: Boolean);
begin
// Действия при завершении потока
Writeln(Format('Поток %d завершился', [Sender.ThreadID]));
end;
Альтернативный ответ
Если по каким-то причинам использование TThreadHelper не подходит, можно воспользоваться стандартным механизмом обработки событий OnTerminate для каждого потока отдельно:
procedure OnMyThreadTerminate(Sender: TObject);
begin
// Действия при завершении потока
Writeln(Format('Поток %d завершился', [TThread(Sender).ThreadID]));
end;
var
MyThread: TThread;
begin
MyThread := TThread.CreateAnonymousThread(
procedure
begin
// Тело потока
Sleep(5000);
end);
MyThread.OnTerminate := OnMyThreadTerminate;
MyThread.Start;
end;
Этот код позволяет обрабатывать завершение каждого потока индивидуально, но требует больше кода для управления большим количеством потоков.
Заключение
В статье был рассмотрен способ использования callback-функций для обработки завершения потоков в Delphi. Представлены два подхода: использование класса TThreadHelper для централизованного управления событиями завершения потоков и обработка события OnTerminate для каждого потока отдельно. Оба подхода позволяют получить идентификатор потока, который завершился, и выполнить необходимые действия.
Описание 'Context': Вопрос касается реализации callback-функций для обработки события завершения потоков в программировании на Delphi с использованием нативного подхода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.