| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Помогите реализовать последовательность действий |
| Автор: maloicds 10.4.2012, 22:48 | ||
Возникла необходимость в своей программе использовать алгоритм, который не могу реализовать ![]() Программа выполняет бесконечный цикл. Есть определённые действия. действие 1 выполняется так: действие длительностью 300мс, простой 300мс, опять действие и так до бесконечности (черные квадраты). действие 2 выполняется через каждые например 2 минуты длительностью 300мс и не совпадает со временем выполнения других действий (красные квадраты). действие 3 выполняется через каждые например 10 минут длительностью 300мс и не совпадает со временем выполнения других действий (зелёные квадраты). и т.д. Таким образом необходимо выполнять в еденицу времени только одно из действий. Немного запутано, но думаю понятно Была идея сделать таким образом:
Интервал у таймера 300мс. |
| Автор: Чучмек 10.4.2012, 23:08 |
| Период необходимо строго выдерживать? |
| Автор: DarkProg 10.4.2012, 23:09 |
| А что собственно не получается? Понял, что у вас не работает... синхронизации нет ни фига... Для того чтобы таймер работал адекватно, в него нельзя засовывать при срабатывании какие-либо действия, иначе он тратит время на то чтобы выполнить что-тро и следующее действие сработает как бы позже чем надо, хотя с точки зрения таймера всё будет верно. Я использую POSTMessage для выполнения нужных действий при срабатывании. Кстати весьма странный критерий... |
| Автор: Чучмек 10.4.2012, 23:19 | ||
|
| Автор: maloicds 10.4.2012, 23:22 |
| Пишу прогу для работы с 1-wire сетью. Время выполнения любого запроса (измерение температуры, команды к датчикам) занимают в среднем 300мс. В то же время необходимо делать опрос сети на предмет получения значений и показаний. Исходя из этого и был выбран интервал 300мс. |
| Автор: DarkProg 10.4.2012, 23:37 | ||
Так вам нужна многопоточность.... |
| Автор: northener 11.4.2012, 00:34 |
| И ещё одно дополнение. Если это действительно MicroLan, то по рекомендациям время зарядки внутреннего конденсатора для питания микропроцессора должно быть >= 500мс (если мне не изменяет мой склероз и если не изменились рекомендации). |
| Автор: maloicds 11.4.2012, 15:39 | ||
Возможно, но я не использую паразитное питание DarkProg Так вам нужна многопоточность.... Многопоточность здесь не подойдёт northener Сеть уже давно работает, сейчас отлаживаю программу.... Чучмек Из кода я ничего не понял.... |
| Автор: Чучмек 11.4.2012, 16:47 |
count - количество событий В mp записываешь периоды повторения для каждого события. В mt хранятся время прошедшее после последней обработки каждого событя. С каждым событием таймера mt - обновляется. Если прошло времени больше, чем период - обрабатываем соответствующее событие. |
| Автор: Чучмек 11.4.2012, 17:50 | ||||
Вот:
Использование:
|
| Автор: maloicds 11.4.2012, 19:00 |
| Чучмек спасибо за код! Правильно ли понимаю что 1/86400 - 1с, 1.5/86400 - 1.5с, 2/86400 - 2с и какая взаимосвязь с timer.interval ?? |
| Автор: Чучмек 11.4.2012, 19:55 | ||
Да. В твоем случае interval=300. Необходимо только учесть, что если, например, интервал 1000 и три события с периодом 2с - то третье событие никогда не наступит. |
| Автор: maloicds 11.4.2012, 20:44 |
| А что за магическое число 86400? И что если захочу поменять интервал у таймера? |
| Автор: Чучмек 11.4.2012, 23:38 |
24часа*60минут*60секунд |
| Автор: northener 12.4.2012, 01:30 | ||
Мне всё же интересно узнать что это за сеть. Если будет время и возможность - сообщите пожалуйста. Можно приватно (в личку). |
| Автор: maloicds 12.4.2012, 10:34 |
| northener, ответил в личке. |
| Автор: northener 13.4.2012, 00:34 |
Да отстал я от жизни. Ещё раз спасибо. Благодаря тем "названиям" я понял, что упустил скачок в развитии этой технологии. Так что я дезавуирую своё утвердение "Тогда я вас разочарую. В ОС Windows вы не сможете работать с этим протоколом." Но ведь ещё несколько лет назад для MicroLan были у разработчков только примеры для ДОС! При том что сам протокол уже лет 20 как существует. Будут конкретные вопросы по работе с конкретными устройствами - готов помочь. |