Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2011, 23:31   #1
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию timer

Есть такая задача:
Задаем переменной значение времени (например 20 минут).
Ровно через 20 минут нужно "что-то сделать" (неважно что, какие-то действия). После этого переменную время сбросить на ноль.

Опять круг, только переменная время получает какое-то значение (например 5 минут), опять пошел отсчет, по прошествии 5 минут "что-то делаем" - переменную время в ноль.

Плюс таких переменных 10, каждая переменная может получить когда угодно значение и какое угодно.


Не знаю доступно ли я рассказал, просто реальную задачу очень долго рассказывать.
Вешать на каждую переменную таймер и каждую секунду проверять. Сильно нагруженно и нерационально, хотелось бы обойтись например одним таймером.

Короче в тупике, прошу подмоги. )))

Мне очень неудобно, но, ей-богу...
Причина закрытия темы подробно описана в самом первом пункте правил раздела...
Там даже примеры приведены, как следует называть свою тему, а как не следует.
С прискорбием, Михалыч. (даже тем, у кого больше 200 постов, правила соблюдать "нуно" )
Причем - "тем более"...
Просто переименовывать по правилам не стал - в воспитательных целях...

Последний раз редактировалось mihali4; 05.12.2011 в 01:12.
Небесный вне форума Ответить с цитированием
Старый 04.12.2011, 23:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

самое простое это 10 таймеров.
в сам интервал таймерра и заносим время, и включаем его, через интервал он сработает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.12.2011, 23:54   #3
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Дело не в самом простом, а в самом правильном. (((
Немного уже надоело лепить вечно, абы работало.

+ еще в дальнейшем развитии моей программы возможно таймер-переменных вырастет до 100, вешать 100 таймеров - глупо.
Небесный вне форума Ответить с цитированием
Старый 04.12.2011, 23:59   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Предлагаю решать задачу так:
1) Помещаем все времена (значение времени, через которое надо что-то выполнить) в массив
2) Соотвественно этим временам создается массив с необходимыми значениями
3) Находится минимальное значение времени и устанавливается Interval таймера в это значение
4) В обработчике таймера, отнимаем у всего массива время, и в массиве где время = 0, обнуляем соотвествующий элемент (или то, что вам необходимо сделать)
5) Повторяются все действия начиная с 3 пункта

Либо для каждого значения массива динамически создавать таймер и настраивать его.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 05.12.2011 в 00:03.
chertovich вне форума Ответить с цитированием
Старый 05.12.2011, 00:00   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я бы реализовал все на Event'ах и WaitForSingleObject ввиде пула потоков.

А вообще
Цитата:
озможно таймер-переменных вырастет до 100, вешать 100 таймеров - глупо.
Это говорит о том, что вы ещё и не в ту сторону копаете и думаете.

Может проще рассказать нам что у вас за задача? А мы подскажем правильный подход к её решению..

Последний раз редактировалось Человек_Борща; 05.12.2011 в 00:03.
Человек_Борща вне форума Ответить с цитированием
Старый 05.12.2011, 00:03   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Держать массив заданий, в нем информацию о каждом задании (запускалось, не запускалось, время запуска, последовательность запуска, интервал и т.д.). В одном таймере проверяйте массив заданий и делайте то, что предусмотрели

add chertovich то же самое предложил чуть раньше

Цитата:
Вы не указали необходимый интервал для таймера
Я думаю ТС сообразит какой интервал, если точность выполнения действий около минуты, то и интервала такого достаточно. И вообще он может быть постоянный - запоминаем в начале время и по каждому тику таймера проверяем сколько времени прошло
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.12.2011 в 00:11.
Аватар вне форума Ответить с цитированием
Старый 05.12.2011, 00:04   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

1 таймер и менять interval каждый раз.
Arigato вне форума Ответить с цитированием
Старый 05.12.2011, 00:05   #8
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Держать массив заданий, в нем информацию о каждом задании (запускалось, не запускалось, время запуска, последовательность запуска, интервал и т.д.). В одном таймере проверяйте массив заданий и делайте то, что предусмотрели
Вы не указали необходимый интервал для таймера
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 05.12.2011, 00:08   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

CreateTimerQueueTimer подойдёт?
Цитата:
Сообщение от chertovich Посмотреть сообщение
1) Помещаем все времена (значение времени, через которое надо что-то выполнить) в массив
2) Соотвественно этим временам создается массив с необходимыми значениями
3) Находится минимальное значение времени и устанавливается Interval таймера в это значение
4) В обработчике таймера, отнимаем у всего массива время, и в массиве где время = 0, обнуляем соотвествующий элемент (или то, что вам необходимо сделать)
5) Повторяются все действия начиная с 3 пункта
Насколько я знаю, эти timer queues внутренне так и работают.
Somebody вне форума Ответить с цитированием
Старый 05.12.2011, 00:12   #10
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Ок, прямая задача.
Пишется программа управления интернет кафе.
Где бабло внеслось, расчет произошел бабло -> время.
По приходу бабла, и запуска времени - дали команду открыть компьютер, бабло, тоесть время закончилось - дали команду закрыть компьютер.

Как бы реализация мне понравилась. Даже очень понравилась, минимум затратного времени, да и реализация очень простая.
Цитата:
Предлагаю решать задачу так:
1) Помещаем все времена (значение времени, через которое надо что-то выполнить) в массив
2) Соотвественно этим временам создается массив с необходимыми значениями
3) Находится минимальное значение времени и устанавливается Interval таймера в это значение
4) В обработчике таймера, отнимаем у всего массива время, и в массиве где время = 0, обнуляем соотвествующий элемент (или то, что вам необходимо сделать)
5) Повторяются все действия начиная с 3 пункта
Но, не прочь выслушать мнения - при уже более ясном подходе к делу.

Последний раз редактировалось Небесный; 05.12.2011 в 00:16.
Небесный вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
timer(vc++) NiCola999 Windows Forms 13 31.01.2011 06:00
timer Erick Cartman Помощь студентам 4 12.03.2010 19:57
Timer Arhangel_bes Помощь студентам 2 27.10.2008 17:55
timer ZYRGiX Помощь студентам 3 21.07.2008 15:15
timer Toxa Компоненты Delphi 6 06.12.2006 06:58