![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| maloicds |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 20.10.2009 Где: Москва Репутация: нет Всего: нет |
Возникла необходимость в своей программе использовать алгоритм, который не могу реализовать
![]() Программа выполняет бесконечный цикл. Есть определённые действия. действие 1 выполняется так: действие длительностью 300мс, простой 300мс, опять действие и так до бесконечности (черные квадраты). действие 2 выполняется через каждые например 2 минуты длительностью 300мс и не совпадает со временем выполнения других действий (красные квадраты). действие 3 выполняется через каждые например 10 минут длительностью 300мс и не совпадает со временем выполнения других действий (зелёные квадраты). и т.д. Таким образом необходимо выполнять в еденицу времени только одно из действий. Немного запутано, но думаю понятно Была идея сделать таким образом:
Интервал у таймера 300мс. |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Период необходимо строго выдерживать?
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
А что собственно не получается?
Понял, что у вас не работает... синхронизации нет ни фига... Для того чтобы таймер работал адекватно, в него нельзя засовывать при срабатывании какие-либо действия, иначе он тратит время на то чтобы выполнить что-тро и следующее действие сработает как бы позже чем надо, хотя с точки зрения таймера всё будет верно. Я использую POSTMessage для выполнения нужных действий при срабатывании. Кстати весьма странный критерий... -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Это сообщение отредактировал(а) Чучмек - 10.4.2012, 23:20 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| maloicds |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 20.10.2009 Где: Москва Репутация: нет Всего: нет |
Пишу прогу для работы с 1-wire сетью. Время выполнения любого запроса (измерение температуры, команды к датчикам) занимают в среднем 300мс. В то же время необходимо делать опрос сети на предмет получения значений и показаний. Исходя из этого и был выбран интервал 300мс.
|
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Так вам нужна многопоточность.... -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Хм. Весьма спорное заявление. Действия в данном случае засовываются не в сам таймер, а в обработчик события OnTimer. Т.е. в обработчик сообщения WM_TIMER окна, которое для данного таймера указано. Удлинять интервал эта обработка может только в том случае, когда эти действия занимают больше времени, чем интервал таймера. Но в таком случае PostMessage довольно плохой помощник, ибо будет происходить накопление в очереди сообщений окна ваших сообщений. Что может просто сделать программу неработоспособной. Кстати сообщения WM_TIMER в отличие от ваших пользовательских в очереди окна не накапливаются. Добавлено через 14 минут и 46 секунд Вот тут стоило бы подробнее сообщить что это за "1-wire сеть". MicroLan от DallasSemiconductors? Тогда я вас разочарую. В ОС Windows вы не сможете работать с этим протоколом. Вам понадобится внешняя нестандартная железяка, которая будет этот протокол выполнять, а ваша программа на ПК будет общаться с ней через стандартный порт ПК. Например через СОМ. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
И ещё одно дополнение. Если это действительно MicroLan, то по рекомендациям время зарядки внутреннего конденсатора для питания микропроцессора должно быть >= 500мс (если мне не изменяет мой склероз и если не изменились рекомендации).
-------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| maloicds |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 20.10.2009 Где: Москва Репутация: нет Всего: нет |
Возможно, но я не использую паразитное питание DarkProg Так вам нужна многопоточность.... Многопоточность здесь не подойдёт northener Сеть уже давно работает, сейчас отлаживаю программу.... Чучмек Из кода я ничего не понял.... |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
count - количество событий В mp записываешь периоды повторения для каждого события. В mt хранятся время прошедшее после последней обработки каждого событя. С каждым событием таймера mt - обновляется. Если прошло времени больше, чем период - обрабатываем соответствующее событие. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Вот:
Использование:
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| maloicds |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 20.10.2009 Где: Москва Репутация: нет Всего: нет |
Чучмек спасибо за код!
Правильно ли понимаю что 1/86400 - 1с, 1.5/86400 - 1.5с, 2/86400 - 2с и какая взаимосвязь с timer.interval ?? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Да. В твоем случае interval=300. Необходимо только учесть, что если, например, интервал 1000 и три события с периодом 2с - то третье событие никогда не наступит. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| maloicds |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 20.10.2009 Где: Москва Репутация: нет Всего: нет |
А что за магическое число 86400? И что если захочу поменять интервал у таймера?
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |