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

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

помогите с пингом


Страницы:   1 2 3 4 5

linuxoid ©   (2010-07-12 13:05:00) 

Здравствуйте.

имеется таблица в базе с ip-адресами. нужно поочередно всех пропинговать.

tablebase.Open;
tablebase.First;
for i:=1 to tablebase.recordcount do begin
adres:=tablebase.fields.Fields[2].AsString;
icmp.Host:=adres;
icmp.Ping();
listbox1.Items.Add('Время до хоста: '+' - '+inttostr(icmp.ReplyStatus.MsRoundTripTime)+'ms')
tablebase.Next;

скажите в чем проблема?


Leonid Troyanovsky   (2010-07-15 13:44:00) [1]


> Anatoly Podgoretsky ©   (15.07.10 13:25) [95]

> Леонид тебе надо много тренироваться, но когда нибудь получишь

Он постарается (c)
:)

--
Regards, LVT.


Anatoly Podgoretsky   (2010-07-15 13:26:00) [2]

> Leonid Troyanovsky  (15.07.2010 11:51:34)  [94]

Это ему только кажется что он сможет прекратить, на самом деле будет
запущена новая копия и так возможно до бесконечности.
Я не понимаю зачес спорить с очевидным?


Anatoly Podgoretsky   (2010-07-15 13:25:00) [3]

> Leonid Troyanovsky  (15.07.2010 11:06:33)  [93]

Леонид тебе надо много тренироваться, но когда нибудь получишь stack
overflow
Короче если не запрещать таймер в начале процедуры, то это всегда игра в
русскую рулетку.


Leonid Troyanovsky   (2010-07-15 11:51:00) [4]


> brother ©   (15.07.10 10:16) [92]

>   Application.ProcessMessages; те тут вероятен вызов таймера
> еще раз? если да, то в начале выхзова мы его прекратим выходом
> из Timer1Timer!?

Зачем рисковать.

--
Regards, LVT.


Leonid Troyanovsky   (2010-07-15 11:06:00) [5]


> Anatoly Podgoretsky ©   (15.07.10 10:10) [91]

> А где у тебя обработка событий? Без нее не получится

Yes! Получил-таки AV:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i, j : Longint;
begin
 for i := 0 to 100 do
   begin
     for j := 0 to 100000  do
       canvas.TextOut(0, 0, IntTostr(j));
     // OutputDebugString(PChar( IntTostr(GetQueueStatus(QS_TIMER))));
     Application.ProcessMessages;
   end;
end;

--
Regards, LVT.


brother   (2010-07-15 10:16:00) [6]

> у тебя есть ProcessMessages, который может получить
> следующий тик таймера,

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
if Work then
  Exit
else
  Work:= True;

ListBox1.Items.Clear;
for i:= 1 to High(IpList) do
begin
  IdIcmpClient1.Host:= IpList[i];
  IdIcmpClient1.Ping();
  ListBox1.Items.Add('10.1.1. ' + inttostr(i) + ' :' +  inttostr(IdIcmpClient1.ReplyStatus.MsRoundTripTime)+'ms');
  Application.ProcessMessages;те тут вероятен вызов таймера еще раз? если да, то в начале выхзова мы его прекратим выходом из Timer1Timer!?
  if not Work then
    Break;
end;
Work:= False;
end;


Anatoly Podgoretsky   (2010-07-15 10:10:00) [7]

> Leonid Troyanovsky  (15.07.2010 09:58:28)  [88]

А где у тебя обработка событий? Без нее не получится


Anatoly Podgoretsky   (2010-07-15 10:09:00) [8]

> brother  (15.07.2010 08:47:27)  [87]

А чего тут представлять, у тебя есть ProcessMessages, который может получить
следующий тик таймера, а это весьма вероятно, поскольку таймер не запрещен и
процесс пойдет вразнос, пока стек не переполнится. Поэтому обязательно
запрещать таймер при входе, даже если ты уверен, что такого не будет.


brother   (2010-07-15 10:06:00) [9]

> if Work then
>  Exit
> else
>  Work:= True;

алгоритм где?


Leonid Troyanovsky   (2010-07-15 09:58:00) [10]


> brother ©   (15.07.10 08:47) [87]

> может дать stack overflow? простой пример, я чет не представляю,
>  а хотелось бы...

Stack overflow на моем w2k3 сервере не получился.

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i : Longint;
begin
 for i := 0 to 1000000 do
   canvas.TextOut(0, 0, IntTostr(i));
 OutputDebugString(PChar( IntTostr(GetQueueStatus(QS_TIMER))));
end;

Максимум, что получилось - 1048592.

--
Regards, LVT.


brother   (2010-07-15 08:47:00) [11]

те на входе - тормозим, а на выходе стартуем... это понятно, но не понятно в каком случае

> if Work then
>   Exit
> else
>   Work:= True;

может дать stack overflow? простой пример, я чет не представляю, а хотелось бы...


Leonid Troyanovsky   (2010-07-15 08:44:00) [12]


> brother ©   (15.07.10 08:19) [85]

> Можно показать, как бы сделали вы?

Translate:

> таймер должен быть запрещен при входе и разрешен (при необходимости)
> при выходе из метода.


with Sender as TTimer do
 begin
   Enabled := False;
   ..
   Enabled := IsNeeded;
 end;

--
Regards, LVT.


brother   (2010-07-15 08:19:00) [13]

Можно показать, как бы сделали вы?


Anatoly Podgoretsky   (2010-07-14 16:26:00) [14]

Тут нарушены принципы безопасной работы с сообщениями, таймер должен быть запрещен при входе и разрешен (при необходимости) при выходе из метода.


Anatoly Podgoretsky   (2010-07-14 16:25:00) [15]

Application.ProcessMessages; перед этим позволит это.


brother   (2010-07-14 15:08:00) [16]

> Возможен повторный запуск в течение интервала

нет

if Work then
  Exit
else
  Work:= True;

не даст этого


Anatoly Podgoretsky   (2010-07-14 13:24:00) [17]

> brother  (14.07.2010 11:19:20)  [80]

Возможен повторный запуск в течение интервала. Надо просто исправить
функцию, что бы даже надежды на подобное не было.


brother   (2010-07-14 11:19:00) [18]

> Это ты зря, ведешь его к stack overflow

в каком случае это будет?
зы интервал таймера 1000


Anatoly Podgoretsky   (2010-07-14 10:10:00) [19]


> Anatoly Podgoretsky ©   (14.07.10 10:09) [78]

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


Anatoly Podgoretsky   (2010-07-14 10:09:00) [20]


> procedure TForm1.Timer1Timer(Sender: TObject);

Это ты зря, ведешь его к stack overflow


Страницы:   1 2 3 4 5

Наверх

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