| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Timer1 |
| Автор: Молоток 16.4.2008, 15:59 |
| Вот меня терзает задача уже несколько дней: у меня есть Timer1 и он конкретно выполняет действия с интервалом. Как мне сделать что бы таймер выполнял рязные действия с разным интервалом, при этом на форме юзался только Один компонент таймера. Спасибо! |
| Автор: MetalFan 16.4.2008, 16:31 |
| ишь какой! и рыбку съесть и сковородку не помыть. так меня интервалы динамически |
| Автор: Молоток 16.4.2008, 16:35 |
| MetalFan, Ну а толку ? Если у меня допустим на 1 таймере надо выполнить 20 задач. |
| Автор: 1Andrey1 16.4.2008, 17:05 |
| я конечно не совсем понимаю зачем нужен такой изврат... но как вариант сделать чтобы таймер тикал чаще, в OnTimer считать количество тиков и выполнять каждое действие через определенное количество тиков, для каждого события - своё |
| Автор: ama_kid 16.4.2008, 18:16 |
| меняй динамически обработчик таймера |
| Автор: MetalFan 16.4.2008, 22:31 |
одновременно? невозможно |
| Автор: Poseidon 17.4.2008, 09:41 | ||
Вместо TTimer используй TRxTimerList из библиотеки RxLib.
|
| Автор: Молоток 17.4.2008, 09:50 |
| Poseidon, Спасибо! 1Andrey1, Также спасибо интересная идея. |
| Автор: mmvds 17.4.2008, 10:24 | ||
| Находим наибольший общий делитель из всех интервалов выполнения задач, устанавливаем интервал таймера таким. Например нужно чтоб задачи выполнялись каждые 1000, 2000, 3000 мс НОД(1000,2000,3000)=1000 ставим интервал таймера 1000. Далее заводим счетчик тактов (целочисленная переменная), когда он без остатка делится на нужный интервал/нод выполняем нужное действие для этого интервала. Пример:
|
| Автор: Poseidon 17.4.2008, 10:29 |
| mmvds, только вот проблема с ограниченностью i. Какого бы типа она не была, все-равно этот тип имеет максимально-допустимое значение. А если программе нужно работать день? А если неделю? А если серверное приложение и месяцами нужно "пахать"? Ну ты понял... |
| Автор: mmvds 17.4.2008, 10:44 | ||
| integer хватит на 2^31/1000/60/60/24 = приблизительно 25 дней это если интервал 1мс поставить ну хорошо, добавим в конец обнуление после 2 млрд итераций, кстати в первой строчке у меня ошибка была вместо i:=i+Timer1.Interval; надо i:=i+1;
|
| Автор: mmvds 17.4.2008, 11:16 |
| 1000/1000 это для наглядности нужный интервал/нод, а i:=i+Timer1.Interval; действительно ошибка, т.к. 1000 mod 2 =0 а в первую итерацию операции для интервала 2000 не должны выполняться, так что никакого оффтопа |
| Автор: Молоток 17.4.2008, 13:27 |
| Poseidon, Мужики спасибо огромное много чего понел: А если вот зачада так стоит: Денамический таймер: Я в листбокс добовляю зачдачу например cmd.exe /C start index.bat Далие Задаю задачу cmd.exe /C start index2.bat И так далие до безконечности. Как сделать что бы бежало в цикле и проверяло ? Спасибо. PS данные о задачах хранятся в реестре: тойсть есть переменная с интервалом и параметрами задачи. Как сделать что бы это работало всё в цикле. Спасибо! |
| Автор: Antony41 14.2.2013, 10:19 | ||||||
создай отдельный поток в onExecute потока
и обращайся через синхронизацию к лист боксу
Добавлено @ 10:20 написал находу так что может есть ошибки Добавлено @ 10:23 еще можно в основном потоке, но я бы сделал всё таки в отдельном
|