Найти рабочий хост

Shouldercannon

Well-known member
25.05.2010
128
0
#1
Есть список IP-адресов. Нужно пробежаться по этому списку, найти рабочий хост и остановить цикл после передав рабочий IP-адрес для дальнейших манипуляций.
Сделал набросок и не работает, постоянно возвращается False даже при одном рабочем хосте.
Код:
procedure TGetHost_Thread.Execute;
var
  CL: TClientSocket;
  I, TimeOut: Integer;
begin
  try
    try
      CL := TClientSocket.Create(nil);
      CL.ClientType := ctNonBlocking;

      for I := 0 to Form1.Memo1.Lines.Count - 1 do
      begin
        B := False;

        CL.Host := Form1.Memo1.Lines.Strings[I];
        CL.Port := 5191;
        CL.Open;
        // Имитация блокирующего режима
        for TimeOut := 1 to 20 do // 20 по 100 ms = 2 секунды
        begin
          if (CL.Active <> True) then
          begin
            Sleep(100);
          end;
        end;

        if CL.Active then
        begin
          B := True;
          Break;
        end;

        CL.Close;
      end;
    except
    end;
  finally
    FreeAndNil(CL);
  end;

  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetHost_Thread.SyncProc;
begin
  if B then ShowMessage('Есть рабочий хост');
end;
 

-master-

Well-known member
14.01.2012
616
12
#2
Вы никак не хотите понять простую вешь.

Формы сами по себе, потоки сами по себе, никаких упоминаний форм контролов и т.п. елементов внутри методов потока не должно фигурировать в принципе. Как только написали в методе Execute доп. потока Form1 или Memo или ... так сразу неправильно.
Просто и тупо - написали - неправильно, без вариантов.
 

Shouldercannon

Well-known member
25.05.2010
128
0
#3
Вы никак не хотите понять простую вешь.

Формы сами по себе, потоки сами по себе, никаких упоминаний форм контролов и т.п. елементов внутри методов потока не должно фигурировать в принципе. Как только написали в методе Execute доп. потока Form1 или Memo или ... так сразу неправильно.
Просто и тупо - написали - неправильно, без вариантов.
В теле потока даже нельзя напрямую обращаться к переменным (Integer, String и т.д.) формы? Их тоже надо в помещать в обёртку
Код:
unit frm_Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TFormMain = class(TForm)
    ...
  private
    { Private declarations }
    ...
  public
    { Public declarations }
    NotResponding: string;
  end;

type
  TMy_Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
    property NotResponding: string read FNotResponding;
  end;

  My_Thread := TFavorite_Thread.Create(True);
  My_Thread.FNotResponding := NotResponding;
  My_Thread.FreeOnTerminate := True;
  My_Thread.Resume;
 

Triton

Well-known member
01.10.2016
58
52
#4
В классе потока надо создать поле, откуда будут браться адреса. И при создании класса потока, но обязательно до запуска потока, заполните это поле.
 

Shouldercannon

Well-known member
25.05.2010
128
0
#5
В классе потока надо создать поле, откуда будут браться адреса. И при создании класса потока, но обязательно до запуска потока, заполните это поле.
Исходя из этого, выше изложенный код с NotResponding: string; то что нужно
 

-master-

Well-known member
14.01.2012
616
12
#7
В теле потока даже нельзя напрямую обращаться к переменным (Integer, String и т.д.) формы?
Доп поток вообще не должен знать ни о каких формах, ни прямо и косвенно. Общение гуи с доп потоком должно быть по средствам спец. механизмов. Например сообщеия. Поток что то сделал кинул сообщение, и плевать есть там кому его ловить или нет.