![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите с пингом
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