Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Нужен совет по использованию таймеров


Автор: Xerx 20.2.2006, 10:29
Допустим, у меня есть повторяющийся во времени процесс. Он состоит из стадий. Каждая стадия имеет свою длительность (в десятках{и сотнях} миллисекунд). Сразу по завершении текущей стадии начинается следующая. При завершении последней действие повторяется. Все управляется таймером. Он должен срабатывать на НЕКОТОРЫХ стадиях несколько раз, а на некоторых достаточно срабатываний на временных границах (т.е. в начале и в конце стадии). Каждая стадия нересурсоемка.
Так вот, как лучше это сделать? Сделать один таймер, который будет вызываться с минимально необходимым периодом и в своем обработчике выбирать действия в зависимости от стадии, или работать с набором таймеров, создавая и уничтожая их для каждой стадии? Или как-то можно изменять параметры таймера без его пересоздания (по его идентификатору)?
Кстати, длительности стадий не кратны (да и частота срабатываний тоже)! Т.е. может быть такой цикл 200(20 раз) - 35(1 раз) - 320(7 раз) - 87(2 раза). Ну, или кратно 5-10 милисекундам.
Каково ваше мнение? Как лучше сделать? И почему?!

Автор: Snowy 20.2.2006, 10:42
Лучше вообще отказаться от таймера.
Создай новый поток, и выполняй все действия там.
Периоды отмеряй через GetTickCount или через Sleep.
Сможешь точно отмерять и указывать что и когда делать.
А таймер штука неточная и зависит от многих факторов.

Автор: Yanis 20.2.2006, 11:26
Что то я не совсем понял вопрос, но если уж нужно использовать таймеры, то почему бы при запуске определённой стадии не вырубать таймер. Что то типа:
Код

Timer.Enable := False;
{ действие }
Timer.Enable := True;

Автор: Xerx 20.2.2006, 23:53
Snowy > Попробую. Но заставлять все нити работать одновременно как-то нехорошо. Даже если некоторые из них будут простаивать в Sleep'е или через GetTickCount. Тогда уже надо, чтобы нити сами себя останавливали и запускали. Весьма ресурсоемко. Но, попробую..

Yanis > Проблема в том, что каждая стадия работает строго определенное время и имеет разное число вызовов таймера. Так что так не очень хорошо.

Автор: Демо 21.2.2006, 10:22
Цитата(Xerx @ 20.2.2006, 23:53 Найти цитируемый пост)
Но заставлять все нити работать одновременно как-то нехорошо.


Какие все?
Ты разве написал, что у тебя параллельно должны выполняться некоторые стадии?

Поставь задачу корректно. Тогда можно будет ее решать.

Автор: Snowy 21.2.2006, 10:46
Цитата(Xerx @ 20.2.2006, 23:53 Найти цитируемый пост)
Тогда уже надо, чтобы нити сами себя останавливали и запускали. Весьма ресурсоемко. Но, попробую..
Зачем их останавливать? Усыпляй, если временно не нужны. При старте программы запустил, при выходе убил.
Пока не нужны - спят, нужны - разбудил.
Усыпляй через WaitForSingleObject. Когда понадобится - отдай ему объект и он проснется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)