Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пинг нескольких компов одновременно [D7, WinXP]


Script ©   (2006-10-02 15:53:00) 

Надо чтоб компы пропинговалиьс как можно быстрее, а до каждого компа время пинга может достигать 2 с.
Своим скудным разумом решил использовать мнгопоточность. Т.к. использовал сие впервые. Возможно ошибся где-то так что вам станет смешно :(

TPingThread = class(TThread)
 private
  PingNum:integer;
 public
   constructor Create(Num:Integer);
   procedure Execute; override;
 end;

Создаю по числу машин в сети
for i:=1 to CompsCount do ICMParray[i]:=TIdIcmpClient.Create(Form2);
Создаю список для потоков
 ThreadList := TList.Create;
По нажатию кнопки на форме создаю потоки
 for i:=1 to CompsCount do ThreadList.Add(TPingThread.Create(i));
Жду 10 сек
Sleep(10000)
И начинаю выводить результаты
for i:=1 to 200 do Memo1.Lines.Add(results[i]);

У потока методы
constructor TPingThread.Create(Num:integer);
begin
 PingNum:=Num;
 inherited Create(False);
end;
procedure TPingThread.Execute;
begin
 FreeOnTerminate := True;
 while not (Terminated or Application.Terminated) do
 begin
  ICMPar[PingNum].Host:=ipadr[PingNum];
  ICMPar[PingNum].ReceiveTimeout:=2000;
  ICMPar[PingNum].Ping;
  if ICMPar[PingNum].ReplyStatus.TimeToLive > 0 then
   result[PingNum]:='пингуется' //массив строк с результатами пингования
  else
   result[PingNum]:='не пингуется';
  Terminate;
  WaitFor;
 end;
end;
В итоге у меня все компы всегда пингуются :-(
Причем заметил такую штуку Host и ReplyStatus.FromIpAddress отличаются постоянно. Такое ощущение что где-то что-то не успевает отработать. Вобщем помогите ламеру кто чем сможет.


Сергей М.   (2006-10-04 09:00:00) [1]


> Script   (02.10.06 16:42) [8]
> Насколько я понимаю поток прибивается сразу после того как
> один раз отработает.


Правильно понимаешь.

А вот по поводу ожидания потоком собственногозавершения (WaitFor) ты понимаешь неправильно.


Ketmar   (2006-10-02 17:39:00) [2]

угу. именно так. давали направление, и говорили: дальше -- сам. не жалею. более того -- благодарен. а если кого учили думать, давая готовые решения... так и рождаются "батонокидатели".


Script   (2006-10-02 17:36:00) [3]

У Вас весьма интересный метод учить думать г-н Ketmar. Если Вас так же учили с детства - сочустую.


Ketmar   (2006-10-02 17:00:00) [4]

>[6] Script 2-Oct-2006, 16:33
>кроме "читай доки", "ищи в google", "ошибка в
>DNA" ничего нет.
sapienti sat. я неоднократно упоминал, что учу думать. сиречь, использовать мозг. а пережёваной пищей пусть другие кормят.


Script   (2006-10-02 16:42:00) [5]

Terminate;
 WaitFor;

Насколько я понимаю поток прибивается сразу после того как один раз отработает.


Сергей М.   (2006-10-02 16:36:00) [6]


> Вобще т.к. ReceiveTimeout:=2000 то больше 2-х сек не имеет
> смысла ждать


Ждать следует ззавершения всех запущенных тобой потоков !


Script   (2006-10-02 16:33:00) [7]

2 Ketmar, я тут по последним темам прошелся. Ты вобще реально чем-то помочь можешь? От тебя кроме "читай доки", "ищи в google", "ошибка в DNA" ничего нет.


Script   (2006-10-02 16:31:00) [8]

Ну да. Вобще т.к. ReceiveTimeout:=2000 то больше 2-х сек не имеет смысла ждать. Но дело-то не в этом.


Сергей М.   (2006-10-02 16:22:00) [9]


> Жду 10 сек


10 секунд - цифирь эта взята от балды, я так понимаю ..


Ketmar   (2006-10-02 16:14:00) [10]

правильно -- сначала почитать какую-нибудь теорию. потому что как иначе я поясню, что неверно? всё. %-)


Script   (2006-10-02 15:58:00) [11]

А как правильно? По примеру из инета делал.


Ketmar   (2006-10-02 15:56:00) [12]

а) всё неправильно %-)
б) а разве icmp из индейцев не асинхронная? (тут не уверен -- не юзаю индейцев %-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо