Есть список 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;