Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2019, 11:03   #1
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
Вопрос Проверка доступности компьютера в другом потоке

Тема стара, как мир, но до сих пор внятного ответа у меня нет.
Проблема: при обращении к другому компьютеру по сети (назовем его сервером), он может быть недоступен (по разным причинам: не работает сеть, выключен сервер, переименована или удалена папка и т.д.). При этом на запрос DirectoryExists (или FileExists) комп зависает на несколько секунд, что плохо.
Чтобы этого избежать, я запускаю таймер на 1.5 секунды и выполняю команду DirectoryExists в отдельном потоке. Далее либо поток завершается, останавливает таймер и сообщает, доступна ли папка, либо таймер завершается первым, останавливает поток и соответственно папка не доступна.
Код:
type
 TThr8 = record
    FThread: TMyThread8;
    FTimer: TTimer;
    path: string;
    fend: boolean;
    bKomp: boolean; //true - комп доступен
    proc: procedure of object;
  end;

  TMyThread8 = class(TThread)
    protected
      procedure Execute; override;
  end;
  
  TForm1 = class(TForm)
  ...
  public
    Thr8: TThr8; 
  ...
	
	
implementation
	
	
procedure TForm1.CheckDrive8; 
begin
  Thr8.path:=sEditPathServer.Text; //сервер

  if Assigned(Thr8.FTimer)=false then
  begin
    Thr8.FTimer:=TTimer.Create(Form1);
    with Thr8.FTimer do
    begin
      Parent:=Form1;
      Interval:=1500;
	  Tag:=0;
      OnTimer:=TimerKomp8Timer;
      Enabled:=false;
    end;
  end;

  Thr8.FThread:=TMyThread8.Create(True);
  Thr8.FThread.FreeOnTerminate:=True;

  Thr8.FThread.Resume;
  Thr8.fend:=false;
  Thr8.FTimer.Enabled:=True;
end;	
	
	
procedure TForm1.TimerKomp8Timer(Sender: TObject);
begin
  Thr8.FTimer.Enabled:=false;
  if Thr8.FTimer.Tag=0 then
  begin
    TerminateThread(Thr8.FThread.Handle, 0);
      //  FreeAndNil(Thr8.FThread);
    Thr8.bKomp:=false;
  end;	
  Thr8.proc;
end;
	
	
procedure TMyThread8.Execute;
begin
  if DirectoryExists(Form1.Thr8.path) then Form1.Thr8.bKomp:=true
                                      else Form1.Thr8.bKomp:=false;
  Form1.Thr8.FTimer.Tag:=1;

  Form1.Thr8.FTimer.Enabled:=False;
  Form1.Thr8.fend:=true; //флаг остановки таймера
  Form1.Thr8.proc;
end;
В программе я Thr8.proc присваиваю процедуру, которая будет вызываться после потока и вызываю CheckDrive8.
Вообще мне надо в процедуре вызвать DirectoryExists и если папка есть, сделать с ней что-то, если нет, вывести сообщение, но по факту получается, что я делю процедуру на две: в первой вызываю CheckDrive8, которая проверяет доступность папки, а затем вызывается вторая процедура, которая делает действия.
При таком варианте мне не требуется выполнения каких-либо действий после выполнения Thr8.proc, т.е. я проверил доступность папки, в процедуре, которую передаю в Thr8.proc взял информацию из папки и вывел на экран.
Код работает, но, во-первых, меня беспокоит, что он кривой и я что-то сделал не так. Во-вторых, мне потребовалось получить данную информацию и сделать с ней что-то, и чтобы не плодить процедуры, я прибег к такому коду:
Код:
//если информация еще не загружена
  if bLoadData=false then
  begin
    Thr8.proc:=LoadData;
    CheckDrive8;
  end;
  
  repeat
    Application.ProcessMessages;
  until (bLoadData) or ((Thr8.fend) and (Thr8.bKomp=false));
Процедура LoadData загружает данные и устанавливает bLoadData в true, если доступен сервер.
Этот код мне совсем не нравится. Как все это с потоками написать красивее и, главное, правильнее?
fanlis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bash проверка доступности хостов Misha305 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 4 12.04.2017 20:50
Проверка доступности URL (masm) Mr.gretty Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.11.2016 12:25
Проверка доступности файла Freezer Общие вопросы Delphi 2 25.03.2011 10:32
Проверка доступности сервера xmaratx Работа с сетью в Delphi 2 21.04.2009 16:14
Проверка доступности файла Marsik Помощь студентам 2 05.04.2008 09:53