![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Xerx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 28.5.2005 Где: Калуга Репутация: нет Всего: нет |
Допустим, у меня есть повторяющийся во времени процесс. Он состоит из стадий. Каждая стадия имеет свою длительность (в десятках{и сотнях} миллисекунд). Сразу по завершении текущей стадии начинается следующая. При завершении последней действие повторяется. Все управляется таймером. Он должен срабатывать на НЕКОТОРЫХ стадиях несколько раз, а на некоторых достаточно срабатываний на временных границах (т.е. в начале и в конце стадии). Каждая стадия нересурсоемка.
Так вот, как лучше это сделать? Сделать один таймер, который будет вызываться с минимально необходимым периодом и в своем обработчике выбирать действия в зависимости от стадии, или работать с набором таймеров, создавая и уничтожая их для каждой стадии? Или как-то можно изменять параметры таймера без его пересоздания (по его идентификатору)? Кстати, длительности стадий не кратны (да и частота срабатываний тоже)! Т.е. может быть такой цикл 200(20 раз) - 35(1 раз) - 320(7 раз) - 87(2 раза). Ну, или кратно 5-10 милисекундам. Каково ваше мнение? Как лучше сделать? И почему?! |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Лучше вообще отказаться от таймера.
Создай новый поток, и выполняй все действия там. Периоды отмеряй через GetTickCount или через Sleep. Сможешь точно отмерять и указывать что и когда делать. А таймер штука неточная и зависит от многих факторов. |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 13 Всего: 111 |
Что то я не совсем понял вопрос, но если уж нужно использовать таймеры, то почему бы при запуске определённой стадии не вырубать таймер. Что то типа:
|
|||
|
||||
| Xerx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 28.5.2005 Где: Калуга Репутация: нет Всего: нет |
Snowy > Попробую. Но заставлять все нити работать одновременно как-то нехорошо. Даже если некоторые из них будут простаивать в Sleep'е или через GetTickCount. Тогда уже надо, чтобы нити сами себя останавливали и запускали. Весьма ресурсоемко. Но, попробую..
Yanis > Проблема в том, что каждая стадия работает строго определенное время и имеет разное число вызовов таймера. Так что так не очень хорошо. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Какие все? Ты разве написал, что у тебя параллельно должны выполняться некоторые стадии? Поставь задачу корректно. Тогда можно будет ее решать. -------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Пока не нужны - спят, нужны - разбудил. Усыпляй через WaitForSingleObject. Когда понадобится - отдай ему объект и он проснется. |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |