Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
Внизпомогите с пингом Найти похожие ветки
← →
brother © (2010-07-14 11:19) [80]> Это ты зря, ведешь его к stack overflow
в каком случае это будет?
зы интервал таймера 1000
← →
Anatoly Podgoretsky © (2010-07-14 13:24) [81]> brother (14.07.2010 11:19:20) [80]
Возможен повторный запуск в течение интервала. Надо просто исправить
функцию, что бы даже надежды на подобное не было.
← →
brother © (2010-07-14 15:08) [82]> Возможен повторный запуск в течение интервала
нетif Work then
Exit
else
Work:= True;
не даст этого
← →
Anatoly Podgoretsky © (2010-07-14 16:25) [83]Application.ProcessMessages; перед этим позволит это.
← →
Anatoly Podgoretsky © (2010-07-14 16:26) [84]Тут нарушены принципы безопасной работы с сообщениями, таймер должен быть запрещен при входе и разрешен (при необходимости) при выходе из метода.
← →
brother © (2010-07-15 08:19) [85]Можно показать, как бы сделали вы?
← →
Leonid Troyanovsky © (2010-07-15 08:44) [86]
> 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:47) [87]те на входе - тормозим, а на выходе стартуем... это понятно, но не понятно в каком случае
> if Work then
> Exit
> else
> Work:= True;
может дать stack overflow? простой пример, я чет не представляю, а хотелось бы...
← →
Leonid Troyanovsky © (2010-07-15 09:58) [88]
> 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 10:06) [89]> if Work then
> Exit
> else
> Work:= True;
алгоритм где?
← →
Anatoly Podgoretsky © (2010-07-15 10:09) [90]> brother (15.07.2010 08:47:27) [87]
А чего тут представлять, у тебя есть ProcessMessages, который может получить
следующий тик таймера, а это весьма вероятно, поскольку таймер не запрещен и
процесс пойдет вразнос, пока стек не переполнится. Поэтому обязательно
запрещать таймер при входе, даже если ты уверен, что такого не будет.
← →
Anatoly Podgoretsky © (2010-07-15 10:10) [91]> Leonid Troyanovsky (15.07.2010 09:58:28) [88]
А где у тебя обработка событий? Без нее не получится
← →
brother © (2010-07-15 10:16) [92]> у тебя есть 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;
← →
Leonid Troyanovsky © (2010-07-15 11:06) [93]
> 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.
← →
Leonid Troyanovsky © (2010-07-15 11:51) [94]
> brother © (15.07.10 10:16) [92]
> Application.ProcessMessages; те тут вероятен вызов таймера
> еще раз? если да, то в начале выхзова мы его прекратим выходом
> из Timer1Timer!?
Зачем рисковать.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2010-07-15 13:25) [95]> Leonid Troyanovsky (15.07.2010 11:06:33) [93]
Леонид тебе надо много тренироваться, но когда нибудь получишь stack
overflow
Короче если не запрещать таймер в начале процедуры, то это всегда игра в
русскую рулетку.
← →
Anatoly Podgoretsky © (2010-07-15 13:26) [96]> Leonid Troyanovsky (15.07.2010 11:51:34) [94]
Это ему только кажется что он сможет прекратить, на самом деле будет
запущена новая копия и так возможно до бесконечности.
Я не понимаю зачес спорить с очевидным?
← →
Leonid Troyanovsky © (2010-07-15 13:44) [97]
> Anatoly Podgoretsky © (15.07.10 13:25) [95]
> Леонид тебе надо много тренироваться, но когда нибудь получишь
Он постарается (c)
:)
--
Regards, LVT.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.006 c