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

### Как превратить однопоточное приложение на Delphi в многопоточное для проверки статуса портов

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

Как превратить однопоточное приложение на Delphi в многопоточное для проверки статуса портов

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

Шаг 1: Создание класса потока

Для начала создадим класс THostChecker, который будет представлять собой поток, проверяющий статус порта:

type
  THostChecker = class(TThread)
  strict private
    FIdTCPClient: TIdTCPClient;
    FHost: string;
    FPort: Integer;
    FConnectTimeout: Integer;
    FIsPortActive: Boolean;
  protected
    procedure Execute; override;
  public
    constructor Create(const AHost: string; APort: Integer; AConnectTimeout: Integer = 50; CreateSuspended: Boolean = False);
    property IsPortActive: Boolean read FIsPortActive;
    property Host: string read FHost;
    property Port: Integer read FPort;
    destructor Destroy; override;
  end;

Шаг 2: Реализация класса потока

Теперь реализуем конструктор и деструктор класса 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




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


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


реклама


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

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