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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2010, 16:19   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Странная работа маленького потока (пингует IP)

Суть в том, что если после создания потока не ждать его завершения, то в мемо может оказать несколько ответов от одного айпишнка (такое чувство, что у разных потоков одна и та же функция IcmpReply) - пытался даже критическую секцию ставить...
Код:
procedure TForm1.FormClick(Sender: TObject);
var
  i: integer;
begin
  ListBox1.Clear;
  for i := 1 to 255 do
  begin
    Caption:=IntToStr(i)+'/'+IntToStr(255);
    TPinger.Create('192.168.137.'+IntToStr(i));
    Sleep(100); //если это убрать, то начнётся бред... (таймаут = 70)
    Application.ProcessMessages;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  cs:=TCriticalSection.Create;
end;

{ TPinger }

constructor TPinger.Create(ip: string);
begin
  Icmp:=TIdIcmpClient.Create();
  icmp.Host:=ip;
  icmp.ReceiveTimeout:=75;
  icmp.OnReply:=IcmpReply;

  inherited Create(false);
end;

procedure TPinger.Execute;
begin
  hEvent:=TEvent.Create(nil,false,false,'');
  try
    icmp.Ping();
  except
    SetEvent(hEvent.Handle);
  end;
  WaitForSingleObject(hEvent.Handle, INFINITE);
  icmp.free;
  hEvent.Free;

end;

procedure TPinger.IcmpReply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
var
  ip: string;
begin
  try
  cs.Enter;
  ip:=AReplyStatus.FromIpAddress;
  if ip<>'0.0.0.0' then
  begin
  Form1.ListBox1.Items.Add (ip+': '+IntToStr (AReplyStatus.MsRoundTripTime));
  end;
  finally
  SetEvent(hEvent.Handle);
  cs.Leave;
  end;
end;

end.
TwiX вне форума Ответить с цитированием
Старый 17.09.2010, 22:33   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

с многопоточностью idicmp очень плохо дружит - это обусловлено особенностью реализации icmp протокола в indy (дублирование id icmp в заголовках пакетов), что может приводить к дублированию информации.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
странная работа функции strcat() kin63camapa Общие вопросы C/C++ 4 05.04.2010 16:19
Литература по программированию на языке delphi маленького размера _PROGRAMM_ Общие вопросы Delphi 4 28.09.2009 20:35
Некорректная работа потока 3D Hunter Общие вопросы Delphi 7 09.03.2009 10:51
Странная работа цикла valerij Microsoft Office Excel 5 06.03.2009 16:40
Поворот маленького примитива на канве valwin Общие вопросы Delphi 7 04.02.2007 03:34