Как сделать таймер делфи
Высокоточный таймер своими руками.
Полагаю, что многие, кто сталкивался с проблемой точного отсчёта времени в Delphi, знают, что стандартный компонент Timer со страницы палитры компонентов System не может обеспечить гарантированно точность отсчёта промежутка времени менее 50 мс. Более того, при работе с этим компонентом частенько случаются “заскоки” при работе в разных ОС. Например, такая проблема с работой компонента рассматривается здесь. Как же сделать так, чтобы программа отсчитывала время точно?
Не будем изобретать велосипед, а воспользуемся уже имеющимся, хотя и малоосвещенным способом – создадим свой мультимедиа таймер с высокой точностью отсчёта промежутков времени.
Для работы воспользуемся ранее рассмотренным проектом из статьи “Мышометры и им подобные звери“. Доработаем проект таким образом, чтобы избавиться от использования стандартного компонента и вместе с тем не нарушить порядок работы программы.
1. Техническая реализация таймера высокой точности.
Вначале уясним, что за программный таймер мы создаем и чем он отличается от компонента Timer, помещенного на форму. А отличается наш таймер, кроме высокой точности, тем, что его не нежно привязывать к окну: при срабатывании стандартного таймера окну, за которым он закреплен, посылается сообщение WM_TIMER. Создаваемый же нами таймер работает по-другому. А теперь приступим к его реализации.
Первое, что вам следует зделать – объявить в секции uses модуь MMSystem. Собственно в нем (модуле) и содержатся все необходимые типы и методы для работы с нашим таймером.
Теперь объявляем переменную:
Напишем процедуру, вызываемую при срабатывании таймера. Она в принципе уже готова (событие onTimer у компонента Timer на главной форме), но для порядка приведу её здесь с небольшим изменениями – в процедуре дополнительно просчитывается текущая скорость движения мыши по экрану:
Теперь создаем наш програмный таймер:
Создавать таймер можно где угодно, лишь бы он выполнял свои функции. Я разместил создание в событии onClick единственной кнопки приложения :).
В приведенном выше отрывке программы с помощью функции timeSetEvent происходит регистрация и запоминание адреса процедуры TimerProc, вызываемой периодически при срабатывании таймера. При успешном создании таймера функция timeSetEvent возвращает ненулевое значение – идентификатор созданного таймера. Оно может использоваться в дальнейшем для определения, какой именно таймер сработал. Значение, возвращаемое функцией timeSetEvent, также необходимо при удалении таймера:
Функция timeKillEvent возвращает целочисленное значение:
Теперь обратимся вновь к процедуре timeSetEvent. Что же мы там задали:
Как вы можете заметить, последний параметр функции – это битовая маска. Флаги этой маски задают два аспекта поведения таймера: количество срабатываний и тип действия, которое требуется выполнить при срабатывании таймера.
Количество срабатываний таймера определяется двумя значениями:
Тип действия, выполняемого таймером, задается при помощи следующих констант:
Т.к. объекты синхронизации нас не интересуют, то рассматривать их в этой статье смысла нет. Вместо этого ещё раз повторим действия, которые необходимо выполнить при работе с программным таймером. Это:
Осталось рассмотреть дополнительные функции по работе с таймером.
2. Дополнительные процедуры по работе с программными таймерами.
Во-первых рассмотрим процедуру timeGetMinPeriod, которая определяет минимальный период таймера. Выглядит она следующим образом:
Блог Евгения Фомина
вторник, 11 ноября 2008 г.
Использование таймеров в Delphi
Использование таймеров в Delphi
Property Enabled: Boolean; | Устанавливается в значение True, если требуется, чтобы включился системный генератор сообщений WM_Timer. |
Property Interval: Cardinal; | Задает промежуток времени в миллисекундах между приходом сообщений. |
Данные свойства позволяют управлять компонентом. Свойство Interval задает
период срабатывания таймера. Через заданный интервал времени после предыдущего
срабатывания, или после программной установки свойства Interval, или после
запуска приложения, если значение Interval установлено во время проектирования,
таймер срабатывает, вызывая событие OnTimer. В обработчике этого события
записываются необходимые операции.
Если задать Interval = 0 или Enabled = False, то таймер перестает работать.
Чтобы запустить отсчет времени надо или задать Enabled = True, если установлено
положительное значение Interval, или задать положительное значение Interval,
если Enabled = False.
Если необходимо в некоторой процедуре запустить таймер, который отсчитал бы заданный
интервал, например, 5 секунд, после чего надо выполнить некоторые операции и отключить
таймер, это можно сделать следующим образом. При проектировании таймер делается
доступным (Enabled = True), но свойство Interval задается равным 0.
Таймер не будет работать, пока в момент, когда нужно запустить таймер, не выполнится
оператор
который отключит таймер.
TTimeredObject = class (TObject)
procedure TimerEvent(Sender:Tobject);
end;
далее опишем саму процедуру TimerEvent которая сработает по окончанию интервала времени.
procedure TTimeredObject.TimerEvent(Sender:TObject);
begin
TimeFinished:=true;
end;
Переменная логического типа Finished должна быть объевлена как глобальная переменная, там же должна быть объявлена переменная Timer1:TTimer. Для этого в разделе interface модуля после ключевого слова var запишем
var
TimeFinished:boolean;
Timer1:TTimer;
В экспортируемой функции LEntry, которая собственно и реализует тот или иной метод, запишем следующие строки:
function LEntry (. )
var TimeredObject:TTimeredObject;
begin
// устанавливаем свойство окончания цикла по времени false
TimeFinished:=false;
// создаем таймер
Timer1:=TTimer.Create(nil);
// устанавливаем интервал
Timer1.Interval:=5000;
// создаем созданный нами вспомогательный объект
TimeredObject:=TTimeredObject.Create;
// присваиваем созданный нами обработчик методу OnClick таймера
Timer1.OnClick:=TimeredObject.TimerEvent;
// запускаем таймер и начинаем цикл
Timer1.Enabled:=true;
Кратко останавлюсь на том, почему потребовалась так присваивать обработчик методу OnClick. В описании класса TTimer метод описан следующим образом
property OnTimer:TNotifyEvent read FOnTimer write SetOnTimer;
Вообще свойство объекта обеспечивает и/или чтение и/или запись с помощью некоторых процедур в некоторое поле класса. В данном случае полем, с которым связано свойство, является поле FOnTimer. Чтение происходит непосредственно из поля, а вот для записи данных в поле применяется специальная процедура SetOnTimer.
Свойство (и естественно поле, связанное с данным свойством) имеет тип TNotifyEvent, который соотвествует наступлению некоторого события. Тип TNotifyEvent определен следующим образом:
TNotifyEvent = procedure (Sender:TObject) of object;
Delphi | Практическая №8
Таймер, или Обуздаем время
Среда Delphi позволяет достаточно легко работать со временем и датами. Кроме того, с помощью компонента Timer можно периодически вызывать события через равные промежутки времени (например, через 1 сек.).
Задачи урока
Выполнение упражнения
В этом упражнении мы создадим приложение «Часы», которое показывает текущее время с точностью до 1 секунды и выводит время, которое прошло с момента запуска приложения (рисунок 1).
1. Дизайн приложения
1. Расположите компоненты, как показано на рисунке 2а и измените значения их свойств согласно рисунку 2б. У меток label2 и Label4 очищено свойство Caption. Также у них жирный шрифт размером 24 пункта.
2. Вставка таймера
2. Измените имена компонентов следующим образом:
3. Обработка события от таймера
1. Выберите таймер и посмотрите на его свойства и события в окне Инспектор объектов (рисунок 4). Их не так уж и много.
Первое свойство — Enabled. Оно имеет логический тип. Если Enabled = True, то таймер работает, если False, то не работает.
Второе свойство — Interval. Задаёт интервал между генерацией события таймера OnTimer (рисунок 4б) в миллисекундах. По умолчанию это свойство равно 1000, т. е. интервал равен одной секунде. В данном случае нас это вполне устраивает, поэтому менять интервал не будем.
2. Каждый раз, когда таймер «тикает», необходимо обновлять время. Для этого сделаем обработчик события «Тиканье часов» (называется он OnTimer). Щёлкните дважды по таймеру на форме. Появится единственный для этого компонента обработчик события. Допишите его следующим образом:
Иначе говоря, указанную выше процедуру можно перевести так: «когда таймер тикает (каждую секунду), текст метки LabelNowTime меняется на текущее время».
3. Теперь необходимо вычислить и отобразить время, в течение которого работает наше приложение. Для этого необходимо запомнить время старта приложения и занести его в переменную типа TDateTime. Назовём её StartTime. Затем при каждом срабатывании таймера будем вычислять и отображать разность между текущим временем и временем, содержащимся в переменной StartTime.
Для этого объявите глобальную переменную StartTime типа TDateTime (выделено жёлтым цветом):
4. Допишите обработчик события таймера OnTimer следующим образом:
Чтобы вычислить разность между двумя временными интервалами (либо между датами), достаточно просто найти их разность.
5. Обработайте событие OnCreate для формы следующим образом:
Описание кода дано в комментариях.
4. Переключение режимов работы таймера
1. Программа автоматически включает таймер в момент старта приложения (т. к. свойство Enabled = True). В работающем приложении остановить его нельзя. Давайте введём эту возможность. Обработайте событие OnClick кнопки «Остановить время» следующим образом:
2. Запустите приложение и посмотрите на результат его работы. Нажмите кнопку «Остановить время».
Теперь вы всегда будете знать, сколько сейчас времени!
5. Коротко о главном
6. Выполнение заданий
Задания I уровня сложности
1. Напишите приложение «Секундомер«. При нажатии на кнопку «Старт» должен запускаться таймер. При этом заголовок кнопки «Старт» меняется на «Стоп». При повторном нажатии на эту кнопку таймер останавливается, а заголовок возвращается в исходное состояние. При старте таймера время начинается с ноля и отображается в компоненте Label.
2. Напишите приложение «Обратный отсчёт«. При нажатии на кнопку «Старт» запускается таймер, а в компоненте Label отображается оставшееся время, начиная с 10 секунд. Когда время выйдет, заголовок метки изменится на «Время вышло».
3. Напишите приложение «Разница между датами«. На форме должно быть расположено два однострочных редактора и кнопка «Вычислить». В однострочные редакторы вводятся даты, между которыми необходимо узнать разницу. Результат (чч.мм.гггг) отображается в компоненте Label после нажатия на кнопку «Вычислить».
4. Напишите приложение, сравнивающее текущую дату и дату, введенную пользователем. Если введенная дата больше, то в компоненте Label появляется сообщение «Вы в будущем», если меньше, то выводится сообщение «Вы в прошлом», и если даты совпадают, то «Вы в настоящем!». Сравнение дат происходит при нажатии на кнопку «Сравнить».
5. Напишите приложение, в котором будут отображаться текущее время и дата. Приложение должно находиться поверх всех окон и быть «прижато» к правому верхнему углу экрана.
6. Напишите приложение, в котором происходит вычисление количества прожитых вами дней. Пользователь вводит дату рождения в однострочный редактор. При нажатии на кнопку «Вычислить» в компоненте Label происходит отображение результата.
7. Напишите приложение, в котором к текущей дате и времени прибавляется заданное число дней и часов. Они вводятся в своих однострочных редакторах. Вывод результата происходит после нажатия на кнопку «Вычислить».
8. Напишите приложение, в котором происходит отсчёт времени, оставшегося до ближайшего Нового года, а также сколько времени прошло от предыдущего. Время отсчитывается в часах.
9. Напишите приложение с двумя однострочными редакторами и кнопкой «Вычислить». В каждый однострочный редактор вводится по дате (например: «20.07.2004» и «18.09.2005»). При нажатии на кнопку «Вычислить» анализируется, входит ли настоящая дата в введенный диапазон. Если входит, то в компоненте Label выводится надпись «Попали в диапазон». В противном случае выводятся сообщения «Раньше» либо «Позже».
Задания II уровня сложности
1. Создайте приложение «Будильник«. На форме находятся однострочный редактор для ввода времени срабатывания будильника и кнопка «Пуск», при нажатии на которую будильник становится активным. Второй однострочный редактор позволяет вводить текст, который появится при срабатывании будильника.
При срабатывании будильника поверх всех окон, в центре экрана, появляется вторая форма красного цвета с этой надписью.
Работа с таймером
Здравствуйте, первый раз на этом форуме и в делфи, так что не обессудте.
Вопрос такой:
Как сделать таймер назад чтобы если в лейбле1 у меня минуты (15 мин) а в лейбле2 секунды, и в лейбле2 секунды начинают отсчет 59..58..57, короче назад и как доходит до 0 секунд в лейбл1 записывается 14 минут а в лейбд2 заново 59..58..57, и так до конца, и когда все по 0 выйти из приложения?
Еще раз извините если что не так, большое спасибо!!
работа с таймером
как сделать так чтобы функция работала определенное кол-во времени
Работа с таймером
Всем привет! Подскажите, кто-нибудь, как сделать таймер вида: 00,01,02,03. 60 (дойдя до 60.
Работа с таймером(?)
Доброго времени суток. Подскажите пожалуйста, никак не могу понять даже с чего начать. Необходимо.
работа с таймером
здравствуйте работаю с таймеров впервые и есть вопросы застрял когда переменная stol равна 1 идет.
а как потом выключить таймер и перейти на другую форму, когда будет 00:00?
Добавлено через 4 минуты
Здравствуйте, дело в том что у меня тест на 15 минут рассчитан и когда время 00:00 форма допустим 1 закрывается а форма 2 открывается и на ней результат выведен, я все сделал(тест) а вот со временем беда, как проще сделать для моего варианта?
Добавлено через 6 минут
вот примерный код но он не работает почему то((
А вот в конкретно моем примере как сделать?
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Работа с таймером
В первые пробую таймер и сразу проблема суть: при появлении формы требуется если нажата кнопка 1.
Работа с таймером
Помогите разобраться в организации работы с таймером. От программы требуется, чтобы каждые n.
Работа с таймером
Имеется три эллипса, допустим что это мишень. Необходимо создать таймер, который по очередности.
Работа с таймером
Ребят подскажи пожалуйста, вот у меня есть stringgrid и на нем стоит защита от ввода информации.
Как создать таймер в проекте без формы?
Как создать таймер без формы в модуле класса?
Я пытаюсь создать таймер в модуле класса на VB5. Пишем в секции General Public WithEvents tmr As.
Как сделать таймер без формы?
Как сделать таймер без формы? То есть чтобы он был в program.cs
Таймер без формы
как создать таймер в обычом юните без формы? ведь при его создании требуется форма, чтобы связать.
Таймер без формы
Господа нужно сделать следующее: в cpp-модуль засунуть таймер (без его визуального редактирования.
Можно использовать функцию GetTickCount. В начале выполнения присвоить значение в переменную, а в процессе выполнения проверять разницу между текущим значением GetTickCount и тем, что было в начале. Сильно сомневаюсь, что у вас система будет работать 49.7 дней без ребута.
Создать таймер не получится, т.к. его надо привязать к конкретному компоненту при создании.
Добавлено через 6 минут
Или вот:
Другой способ никак нельзя. А варнинги убрать можно простым удалением переменных из текста и блока var.
Puporev, а чем не подходит последний предложенный вариант?
Добавлено через 10 минут
сделал в таком виде «инжекторный ДЛЛ» не получается (Не отвечает пишет)
Добавлено через 4 минуты
Вот пара таймеров, которым нафих не нужны никакие формы и никакие TThread:
Вложения
ThreadPoolTimersU.zip (2.6 Кб, 10 просмотров) |
Добавлено через 41 минуту
нашел на этом же форуме спасибо тем кто ответил благодарен вам что не так делаю а теперь не показывает сообщения (
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Таймер без формы Lazarus
Возникла проблема с таймером. Дело в том, что в модуле(unit) есть набор функций которые реализуют.
Как создать приложение без формы?
Как создать приложение без формы, т.е. чтобы класс который создается при запуске программы(form1).
Создать таймер обратного отсчета без привязки к клиенту
Здраствуйте задача создать/найти таймер который не будет привязан к браузеру пользевателя.