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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите реализовать последовательность действий 
:(
    Опции темы
maloicds
Дата 10.4.2012, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возникла необходимость в своей программе использовать алгоритм, который не могу реализовать  smile Суть его попробую обьяснить на рисунке:
user posted image
Программа выполняет бесконечный цикл. Есть определённые действия.
действие 1 выполняется так: действие длительностью 300мс, простой 300мс, опять действие и так до бесконечности (черные квадраты).
действие 2 выполняется через каждые например 2 минуты длительностью 300мс и не совпадает со временем выполнения других действий (красные квадраты).
действие 3 выполняется через каждые например 10 минут длительностью 300мс и не совпадает со временем выполнения других действий (зелёные квадраты).
и т.д.
Таким образом необходимо выполнять в еденицу времени только одно из действий. Немного запутано, но думаю понятно smile
Была идея сделать таким образом:

Код

 d1: array[1..20] of integer=(1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0);
 d2: array[1..20] of integer=(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0);
 d3: array[1..20] of integer=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0);
 d4: array[1..20] of integer=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1);

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if d1[k]=1 then .....
 if d2[k]=1 then .....
 if d3[k]=1 then .....
 if d4[k]=1 then .....
 inc(k);
 if k=21 then k:=1;
end;


Интервал у таймера 300мс.

PM MAIL   Вверх
Чучмек
Дата 10.4.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Период необходимо строго выдерживать?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
DarkProg
Дата 10.4.2012, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



А что собственно не получается?
Понял, что у вас не работает... синхронизации нет ни фига...
Для того чтобы таймер работал адекватно, в него нельзя засовывать при срабатывании какие-либо действия, иначе он тратит время на то чтобы выполнить что-тро и следующее действие сработает как бы позже чем надо, хотя с точки зрения таймера всё будет верно.

Я использую POSTMessage для выполнения нужных действий при срабатывании. 

Цитата(maloicds @  10.4.2012,  23:48 Найти цитируемый пост)
действие длительностью 300мс

Кстати весьма странный критерий... 


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Чучмек
Дата 10.4.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Код

const count=4;
var
mp:array[0..count-1]of integer;
mt:array[0..count-1]of integer;


procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin

for i:=0 to count-1 do
mt[i]:=mt[i]-Timer1.Interval;

for i:=0 to count-1 do
 if  mt[i]<=0 then
  begin
  mt[i]:=mp[i];//mt[i]:=mt[i]+mp[i]
  //
  Здесь обработка i-го события
  //
  break;
  end;


end;


Это сообщение отредактировал(а) Чучмек - 10.4.2012, 23:20


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
maloicds
Дата 10.4.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу прогу для работы с 1-wire сетью. Время выполнения любого запроса (измерение температуры, команды к датчикам) занимают в среднем 300мс. В то же время необходимо делать опрос сети на предмет получения значений и показаний. Исходя из этого и был выбран интервал 300мс.
PM MAIL   Вверх
DarkProg
Дата 10.4.2012, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Цитата(maloicds @  11.4.2012,  00:22 Найти цитируемый пост)
В то же время необходимо делать опрос сети на предмет получения значений и показаний.

Так вам нужна многопоточность....


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
northener
Дата 11.4.2012, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(DarkProg @  10.4.2012,  23:09 Найти цитируемый пост)
Для того чтобы таймер работал адекватно, в него нельзя засовывать при срабатывании какие-либо действия, иначе он тратит время на то чтобы выполнить что-тро и следующее действие сработает как бы позже чем надо, хотя с точки зрения таймера всё будет верно.

Хм. Весьма спорное заявление. Действия в данном случае засовываются не в сам таймер, а в обработчик события OnTimer. Т.е. в обработчик сообщения WM_TIMER окна, которое для данного таймера указано. Удлинять интервал эта обработка может только в том случае, когда эти действия занимают больше времени, чем интервал таймера. Но в таком случае PostMessage довольно плохой помощник, ибо будет происходить накопление в очереди сообщений окна  ваших сообщений.  Что может просто сделать программу неработоспособной. Кстати сообщения WM_TIMER в отличие от ваших пользовательских в очереди окна не накапливаются.

Добавлено через 14 минут и 46 секунд
Цитата(maloicds @  10.4.2012,  23:22 Найти цитируемый пост)
Пишу прогу для работы с 1-wire сетью.

Вот тут стоило бы подробнее сообщить что это за "1-wire сеть". MicroLan от DallasSemiconductors? Тогда я вас разочарую. В ОС Windows вы не сможете работать с этим протоколом. Вам понадобится внешняя нестандартная железяка, которая будет этот протокол выполнять, а ваша программа на ПК будет общаться с ней через стандартный порт ПК. Например через СОМ. 


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
northener
Дата 11.4.2012, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



И ещё одно дополнение. Если это действительно MicroLan, то по рекомендациям время зарядки внутреннего конденсатора для питания микропроцессора должно быть >= 500мс (если мне не изменяет мой склероз и если не изменились рекомендации).


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
maloicds
Дата 11.4.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(northener @ 11.4.2012,  00:34)
время зарядки внутреннего конденсатора для питания микропроцессора должно быть >= 500мс

Возможно, но я не использую паразитное питание

DarkProg Так вам нужна многопоточность....
Многопоточность здесь не подойдёт

northener
Сеть уже давно работает, сейчас отлаживаю программу....

Чучмек
Из кода я ничего не понял....
PM MAIL   Вверх
Чучмек
Дата 11.4.2012, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(maloicds @  11.4.2012,  15:39 Найти цитируемый пост)
Из кода я ничего не понял.... 

count - количество событий
В mp записываешь периоды повторения для каждого события.
В mt хранятся время прошедшее после последней  обработки каждого событя.
С каждым событием таймера mt - обновляется.
Если прошло  времени больше, чем период - обрабатываем соответствующее событие.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 11.4.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Вот:
Код

type
tEventRec=record
 period:TDateTime;
 EventTime:TDateTime;
 proc:procedure;
 end;
tEvents=class
 m:array of tEventRec;
 count:integer;
 procedure Add(period,starttime:TDateTime;procadr:pointer);
 procedure Update;
 constructor Create;
 destructor Destroy;
end;

{ tEvents }

procedure tEvents.Add(period, starttime: TDateTime; procadr: pointer);
begin
if count>=length(m)then
setlength(m,length(m)+256);
m[count].period:=period;
m[count].EventTime:=starttime;
m[count].proc:=procadr;
inc(count);
end;

constructor tEvents.Create;
begin
count:=0;
end;

destructor tEvents.Destroy;
begin
m:=nil;
end;

procedure tEvents.Update;
var
 curtime:TDateTime;
 i:integer;
begin
curtime:=Date+Time;
for i:=0 to count-1 do
 if m[i].EventTime<=curtime then
  begin
  m[i].EventTime:=m[i].EventTime+m[i].period;
  if m[i].EventTime<curtime then m[i].EventTime:=curtime+m[i].period;
  m[i].proc;
  break;
  end;  
end;

Использование:
Код

procedure p1;
begin
form1.Memo1.Lines.Add('p1');
end;
procedure p2;
begin
form1.Memo1.Lines.Add('p2');
end;
procedure p3;
begin
form1.Memo1.Lines.Add('p3');
end;

var evs:tEvents;

procedure TForm1.FormCreate(Sender: TObject);
begin
evs:=tEvents.Create;
evs.Add(1/86400,Date+Time,@p1);
evs.Add(1.5/86400,Date+Time+0.5/86400,@p2);
evs.Add(2/86400,Date+Time+2/86400,@p3);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 evs.Update;
end;





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
maloicds
Дата 11.4.2012, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чучмек спасибо за код!
Правильно ли понимаю что 1/86400 - 1с,  1.5/86400 - 1.5с, 2/86400 - 2с и какая взаимосвязь с timer.interval ??

PM MAIL   Вверх
Чучмек
Дата 11.4.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(maloicds @  11.4.2012,  19:00 Найти цитируемый пост)
Правильно ли понимаю что 1/86400 - 1с,  1.5/86400 - 1.5с, 2/86400 - 2с

Да.
Цитата(maloicds @  11.4.2012,  19:00 Найти цитируемый пост)
какая взаимосвязь с timer.interval ??

В твоем случае interval=300. 
Необходимо только учесть, что если, например, интервал 1000 и три события с периодом 2с - то третье событие никогда не наступит.   



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
maloicds
Дата 11.4.2012, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что за магическое число 86400? И что если захочу поменять интервал у таймера?
PM MAIL   Вверх
Чучмек
Дата 11.4.2012, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(maloicds @  11.4.2012,  20:44 Найти цитируемый пост)
А что за магическое число 86400?

24часа*60минут*60секунд



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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