Как превратить однопоточное приложение на Delphi в многопоточное для проверки статуса портов
Вопрос, поднятый пользователем, заключается в необходимости преобразования однопоточного приложения на Delphi в многопоточное для одновременной проверки статуса 50 портов каждые 10 секунд. Для этого необходимо использовать потоки, которые будут выполнять проверку портов параллельно.
Шаг 1: Создание класса потока
Для начала создадим класс THostChecker, который будет представлять собой поток, проверяющий статус порта:
Теперь реализуем конструктор и деструктор класса THostChecker, а также метод Execute, который будет содержать логику проверки порта:
constructor THostChecker.Create(const AHost: string; APort: Integer; AConnectTimeout: Integer; CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FHost := AHost;
FPort := APort;
FConnectTimeout := AConnectTimeout;
FIdTCPClient := TIdTCPClient.Create(nil);
FIsPortActive := False;
end;
destructor THostChecker.Destroy;
begin
FIdTCPClient.Free;
inherited;
end;
procedure THostChecker.Execute;
begin
inherited;
with FIdTCPClient do begin
Host := FHost;
Port := FPort;
ConnectTimeout := FConnectTimeout;
try
Connect;
FIsPortActive := True;
except
// Игнорирование исключений
end;
end;
end;
Шаг 3: Обработка завершения потока
Для обработки результатов работы потока, создадим процедуру HostCheckerTerminate, которая будет вызываться при завершении потока:
procedure TForm4.HostCheckerTerminate(Sender: TObject);
var
hostChecker: THostChecker;
hostAndPort: string;
begin
hostChecker := THostChecker(Sender);
hostAndPort := Format('%s:%d', [hostChecker.Host, hostChecker.Port]);
if hostChecker.IsPortActive then
listbox_online.items.add(hostAndPort)
else
listbox_offline.items.add(hostAndPort);
end;
Шаг 4: Запуск потоков
Теперь, когда у нас есть класс потока, мы можем запустить потоки для проверки списка хостов и портов. Для этого создадим процедуру, которая будет запускаться при нажатии кнопки:
procedure TForm4.Button1Click(Sender: TObject);
const
hosts: array [0..6] of string = ('google.com', 'stackoverflow.com', 'youtube.com', 'foo.org', 'null.org', 'porn.com', 'microsoft.com');
var
i: Integer;
begin
for i:=Low(hosts) to High(hosts) do
with THostChecker.Create(hosts[i], 80, 50, False) do begin
OnTerminate := HostCheckerTerminate;
FreeOnTerminate := True;
Start;
end;
end;
Шаг 5: Периодическая проверка
Для периодической проверки портов каждые 10 секунд, можно использовать TTimer или OnIdleEvent для повторного вызова Button1Click.
Заключение
Приведенный выше пример демонстрирует, как можно преобразовать однопоточное приложение в многопоточное для проверки статуса портов. Обратите внимание на использование FreeOnTerminate для автоматического освобождения ресурсов и OnTerminate для обработки результатов работы потока. Не забудьте также учесть, что доступ к UI-элементам из потока небезопасен, и нужно использовать механизмы синхронизации для обновления интерфейса.
Преобразование однопоточного приложения на Delphi в многопоточное для параллельной проверки статуса портов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.