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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2015, 01:36   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Функция с задержкой

Нужно время от времени проверять наличие интернет-соединения. Для этого создал функцию которая пингует IP 4.2.2.2, и возвращает результат True (если удачно) и False (если нет).
Подскажите, как сделать так, чтобы функция в случае неудачи первого пинга, пинговала еще три IP с интервалом в 3 секунды и только если все 3 пинга неудачны, возвращала результат False?

Код:
function TForm1.InetConnected : Boolean;
begin
  try
    ipPing1.PingHost('4.2.2.2');
    Result:= True;
  except
    Result:= False;
  end;
 end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 if InetConnected 
 then showmessage('инет есть!')
 else showmessage('инета нет!');
end;
garuna вне форума Ответить с цитированием
Старый 10.02.2015, 03:55   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
Нужно время от времени проверять наличие интернет-соединения. Для этого создал функцию которая пингует IP 4.2.2.2, и возвращает результат True (если удачно) и False (если нет).
Подскажите, как сделать так, чтобы функция в случае неудачи первого пинга, пинговала еще три IP с интервалом в 3 секунды и только если все 3 пинга неудачны, возвращала результат False?
Либо добавь таймер, либо доппоток.
northener вне форума Ответить с цитированием
Старый 10.02.2015, 05:21   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

сделай список хостов и пингуй их в цикле в соседнем потоке (шоб прога не висела).
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.02.2015, 07:10   #4
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Код:
function TForm1.InetConnected : Boolean;
var
  b: boolean;
begin
  b := false;
  try
    ipPing1.PingHost('4.2.2.2');
    b:= True;
  except
    b:= False;
  end;
  if b := false then // если IP получен, то b уже в true, и вход в условие не происходит. Иначе проверяем второй IP. По аналогии делается с третьим
    begin
      //проверка второго IP
    end;
  Result := r;
 end;

Последний раз редактировалось WinCoder; 10.02.2015 в 07:17.
WinCoder вне форума Ответить с цитированием
Старый 10.02.2015, 07:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сделай список хостов и пингуй их в цикле в соседнем потоке
Согласен. Вот такое можно в поток кинуть:
Код:
const ips:array[1..3] of string=('1.1.1','2.2.2.2','3.3.3.3');
...
function InetConnected(ip:string) : Boolean;
begin
  try
    ipPing1.PingHost(ip);
    Result:= True;
  except
    Result:= False;
  end;
 end;

begin
 for i:=Low(a) to High(a) do begin
  if InetConnected(a[i])  then break
  else sleep(3000);
 end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.02.2015, 12:06   #6
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

WinCoder, а как же 3-секундный интервал между пингом?
Stilet, допустим. но как тогда обращаться? к обычной функции вот так:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 if InetConnected 
 then showmessage('инет есть!')
 else showmessage('инета нет!');
end;
а если завернуть эту функцию в поток, то как тогда ее вызвать? извиняюсь, если вопрос глупый, просто потоки еще не изучал толком.
garuna вне форума Ответить с цитированием
Старый 10.02.2015, 12:16   #7
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

если обернуть код Stilet'a в поток, то нужно указать глобальную переменную и смотреть что она показывает, после синхронизации конечно
ZuBy вне форума Ответить с цитированием
Старый 10.02.2015, 12:27   #8
wslab
Заблокирован
 
Регистрация: 23.01.2015
Сообщений: 16
По умолчанию

Как вариант, сделать через таймер. Интервал таймера 3 секунды. Список адресов, и текущий индекс адреса, глобальные переменные. После запуска таймер с интервалом 3 секунды проверяет каждый адрес. Если одна из попыток удачна, остановка таймера.

Последний раз редактировалось wslab; 10.02.2015 в 12:32.
wslab вне форума Ответить с цитированием
Старый 10.02.2015, 13:06   #9
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

сделал еще проще без потоков и таймеров. немного переделал код от Stilet - вместо Sleep(3000) поставил еще один цикл который создает задержку в 3 сек без зависаний:
Код:
   for j:=1 to 150 do
   begin
    Sleep(20);
    Application.ProcessMessages;
   end;
Всем спасибо за помощь, вопрос решен!
garuna вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос с задержкой sa920 Microsoft Office Excel 5 03.06.2012 00:44
DDE с задержкой sart21 Microsoft Office Excel 8 14.08.2011 19:13
таймер с задержкой на включение amandra Общие вопросы Delphi 3 22.04.2008 23:20
многострочная подсказка с задержкой dimonbest Общие вопросы Delphi 6 24.03.2008 13:13