Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен совет по использованию таймеров 
:(
    Опции темы
Xerx
Дата 20.2.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.5.2005
Где: Калуга

Репутация: нет
Всего: нет



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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Лучше вообще отказаться от таймера.
Создай новый поток, и выполняй все действия там.
Периоды отмеряй через GetTickCount или через Sleep.
Сможешь точно отмерять и указывать что и когда делать.
А таймер штука неточная и зависит от многих факторов.
PM MAIL   Вверх
Yanis
Дата 20.2.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



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

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



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Xerx
Дата 20.2.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.5.2005
Где: Калуга

Репутация: нет
Всего: нет



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

Yanis > Проблема в том, что каждая стадия работает строго определенное время и имеет разное число вызовов таймера. Так что так не очень хорошо.
PM MAIL ICQ   Вверх
Демо
Дата 21.2.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



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


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

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


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 21.2.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Xerx @ 20.2.2006, 23:53 Найти цитируемый пост)
Тогда уже надо, чтобы нити сами себя останавливали и запускали. Весьма ресурсоемко. Но, попробую..
Зачем их останавливать? Усыпляй, если временно не нужны. При старте программы запустил, при выходе убил.
Пока не нужны - спят, нужны - разбудил.
Усыпляй через WaitForSingleObject. Когда понадобится - отдай ему объект и он проснется.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.