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

Тема в разделе "Delphi - Сети", создана пользователем Shouldercannon, 30 сен 2016.

  1. Shouldercannon

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Есть список IP-адресов. Нужно пробежаться по этому списку, найти рабочий хост и остановить цикл после передав рабочий IP-адрес для дальнейших манипуляций.
    Сделал набросок и не работает, постоянно возвращается False даже при одном рабочем хосте.
    Код (Delphi):
    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;
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Вы никак не хотите понять простую вешь.

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

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    В теле потока даже нельзя напрямую обращаться к переменным (Integer, String и т.д.) формы? Их тоже надо в помещать в обёртку
    Код (Delphi):
    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;
     
  4. Triton

    Triton Member

    Регистрация:
    1 окт 2016
    Сообщения:
    13
    Симпатии:
    11
    В классе потока надо создать поле, откуда будут браться адреса. И при создании класса потока, но обязательно до запуска потока, заполните это поле.
     
  5. Shouldercannon

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Исходя из этого, выше изложенный код с NotResponding: string; то что нужно
     
  6. Triton

    Triton Member

    Регистрация:
    1 окт 2016
    Сообщения:
    13
    Симпатии:
    11
    Да.
     
    Shouldercannon нравится это.
  7. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Доп поток вообще не должен знать ни о каких формах, ни прямо и косвенно. Общение гуи с доп потоком должно быть по средствам спец. механизмов. Например сообщеия. Поток что то сделал кинул сообщение, и плевать есть там кому его ловить или нет.
     
Загрузка...

Поделиться этой страницей