![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужен совет по использованию таймеров
Xerx © (2006-02-20 10:27:00)Допустим, у меня есть повторяющийся во времени процесс. Он состоит из стадий. Каждая стадия имеет свою длительность (в десятках{и сотнях} миллисекунд). Сразу по завершении текущей стадии начинается следующая. При завершении последней действие повторяется. Все управляется таймером. Он должен срабатывать на НЕКОТОРЫХ стадиях несколько раз, а на некоторых достаточно срабатываний на временных границах (т.е. в начале и в конце стадии). Каждая стадия нересурсоемка.
Так вот, как лучше это сделать? Сделать один таймер, который будет вызываться с минимально необходимым периодом и в своем обработчике выбирать действия в зависимости от стадии, или работать с набором таймеров, создавая и уничтожая их для каждой стадии? Или как-то можно изменять параметры таймера без его пересоздания (по его идентификатору)?
Кстати, длительности стадий не кратны (да и частота срабатываний тоже)! Т.е. может быть такой цикл 200(20 раз) - 35(1 раз) - 320(7 раз) - 87(2 раза). Ну, или кратно 5-10 милисекундам.
Каково ваше мнение? Как лучше сделать? И почему?!
RO (2006-02-21 08:20:00) [1]do_something_work() - блокирующая ф-ция ?
Где гарантия что время ее выполнения будет заведомо меньше периода срабатывания таймера ?
Xerx (2006-02-20 23:57:00) [2]Чисто эмпирический код. Не мой.
<обработка таймера>
case State of
state_1:
begin
ElapsedTime := OldTime - GetTickCount();
inc(TotalTime, ElapsedTime);
if (TotalTime >= MaxTime[state_1]) then
begin
State := state_2;
OldTime := GetTickCount();
TotalTime := 0;
exit;
end;
if (ElapsedTime >= State_1_interval) then
do_something_work();
end;
state_2: begin ... end;
...
end;
Ну, вроде так.
RO (2006-02-20 13:09:00) [3]Приведи пример "стадии" в коде либо в псевдокоде ..