Как сделать таймер в c

Обновлено: 07.07.2024

Немного поговорим о применении класса QTimer в Qt. Это небольшая легкая тема после серии объемных статей про QSqlTabelModel и вытекающих из неё последствий. А то уже у самого серое вещество закипает.

Таймеры нам могут понадобиться для создания опроса устройств по ЛВС через стек TCP/IP с определенной периодичностью или для ежечасной проверки данных или активных подключений к серверу. Да для чего угодно!? И тут нам на помощь приходит QTimer, который Мы рассмотрим на примере ежесекундного вывода времени в QLabel.

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QTimer

Используем минимум файлов в нашем проекте:

  • QDataMapperWidget.pro - профайл;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - формочка основного окна приложения;
  • А формочку нарисуем в Дизайнере QtCreator. Впрочем там и рисовать нечего. Кинули QLabel в середину и готово.

mainwindow.h

Всё, что нам надо для счастья в этом проекте - это слот, который будет реагировать на срабатывание QTimer, да сам объекта этого класса.

mainwindow.cpp

А теперь несколько строчек по запуску таймера. По-моему комментариев больше, чем кода. Обычно так на Assembler'е пишут - 20 % кода и 80% комментариев.

В результате при запуске обнаружим, как каждую секунду у Нас меняется время в окне приложения

QTimer example

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Иногда в приложениях, работающих в графическом интерфейсе Windows, возникает необходимость отображения текущего времени суток (часы:минуты:секунды). Для реализации этой задачи в аппаратуре компьютера предусмотрен доступ к таймеру.

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

Система Microsoft Visual Studio представляет для пользователя элемент управления Timer , реализующий выполнение прерывания от таймера.

Также с помощью компонента Timer можно организовать параллельное выполнение различных процессов в программе.

В данном примере показано, как использовать компонент Timer для вывода на форме текущего времени. Также показано как можно управлять таймером, останавливая и продолжая показ текущего времени.

Выполнение

1. Создание проекта по шаблону Windows Forms Application .

Запустить MS Visual Studio . Создать проект по шаблону Windows Forms Application . Подробный пример создания проекта по шаблону Windows Forms Application описывается здесь .

2. Создание главной формы.

Создать форму, как показано на рисунке 1.

Разместить на форме следующие компоненты:

  • компонент типа Label . Создается объект (экземпляр класса) с именем label1 ;
  • два компонента типа Button . Создается два объекта с именами button1 и button2 ;
  • компонент типа TTimer (рисунок 1). Создается объект с именем timer1 .
3. Настройка компонент типа Label и Button .

Настроить следующие свойства компонент Label и Button :

  • в элементе управления label1 свойство Text = « — «;
  • в элементе управления button1 свойство Text = « Go «;
  • в элементе управления button2 свойство Text = « Stop «.

Если пользователь сделает клик на кнопке button1 (начало отсчета), часы реального времени будут включены. При клике на кнопке button2 время будет остановлено.

После настройки элементов управления форма будет иметь вид как показано на рисунке 2.

4. Настройка компонента типа Timer .

В компоненте Timer свойство Interval установить в значение 100 (рисунок 3) или в любое другое значение. Значение Interval измеряется в миллисекундах. Interval задает частоту вызова обработчика события, то есть частоту изменения значения часов реального времени.

Рис. 3. Свойство Interval элемента управления Timer

5. Программирование обработчика события Tick .

В обработчик события Tick вписывается собственный программный код, который отображает часы реального времени.

Листинг обработчика timer1_Tick() события Tick следующий:

В вышеприведенном коде использованы возможности класса DateTime , который имеет средства для отображения текущего времени.

6. Программирование событий клика на кнопках Button1 и Button2 .

Для того, чтобы время начало отображаться нужно активизировать таймер. Для активации/деактивации таймера в элементе управления Timer используется свойство Enabled .

Обработчик события клика на кнопке Button1 имеет вид:

Чтобы остановить таймер, нужно свойство Enabled элемента управления Timer установить в значение false .

7. Запуск программы на выполнение.

После запуска программы на выполнение окно формы будет иметь вид как изображено на рисунке 4.

Если в программе нужно постоянно отображать текущее время, тогда строку

можно разместить в начале загрузки формы (в конструкторе или в обработчике события Load ).

Практически в любой прорамме необходим контроль времени. Конечно вам может понадобится запустить таймер отдельным потоком и периодически "смотреть который час", но в этой статье я расскажу всего лишь о функции, которая отсчитывает заданное время в миллисекундах и завершает своё действие. Эта функция весьма и весьма похожая на sleep() функция.

Подключим заголовочные файлы:

. отличием нашей функции (путь это будет how2timer) является то, что она принимает значение времени в миллисекундах ;)

Для всех делов мы воспользуемся функцией clock(), которая возвращает время, измеряемое процессором в тактах от начала выполнения программы, или ?1, если оно не известно. Проверок делать не будем) не до того нам =)

Также оприделена константа CLOCKS_PER_SEC - это количество тактов системных часов в секунду.
Нам естественно необходимо пересчитать это время для работы с миллисекундами.
Когда константа готова сосчитаем время завершения отсчёта.

При написании многих программ часто возникает необходимость следить за временем и периодично выполнять какие-нибудь действия. Для этого используют таймеры. При использовании кроссплатформенного фреймворка Qt используют QTimer.

В этой заметке я расскажу о классе QTimer, о создании таймера и об обработке его событий, о статическом методе singleShot() класса QTimer. На примере покажу, как создать программу, которая показывает текущее время в течение 5-ти секунд, а после закрывается. Таймер в ней нужен для обновления текущего времени на экране каждую секунду. Метод singleShot() понадобится для закрытия программы через 5 секунд.

Класс унаследован от QObject, а значит умеет работать с сигналами и слотами. Предоставляет регулярные таймеры, которые по истечении заданного промежутка времени посылают сигнал timeout(). При этом класс имеет статический метод singleShot(), он посылает сигнал через заданный промежуток времени лишь один раз. События таймера будут доставлять только тогда, когда работает цикл обработки событий.

Включает в себя public-функции:

  • int interval() — возвращает числовое(int) значение установленного интервала таймера в миллисекундах
  • int remainingTime() — возвращает оставшееся время в миллисекундах
  • bool isActive() — возвращает логическое(bool) значение true, если таймер запущен
  • bool isSingleShot() — возвращает true, если таймер включен для срабатывания только один раз
  • void setInterval(int msec) — возволяет установить интервал таймера, где msec — время в миллисекундах
  • void setSingleShot(bool singleShot)
  • void setTimerType(Qt::TimerType atype) — устанавливает тип таймера
  • int timerId() — возвращает id таймера
  • Qt::TimerType timerType() — возвращает тип таймера

Включает в себя слоты start() и stop(), которые запускают и останавливают таймер соответственно. У слота start() есть одна пеперегрузка — start(int msec), которая через msec миллисекунд запускает таймер, если таймер не запущен, в противном случае таймер останавливается и запускается снова.

Имеет сигнал timeout(), который посылается во время срабатывания таймера.

Рассмотрим на примере использование таймера. Создадим программу, о которой говорилось выше. Она будет показывать текущее время, а по истечении 5-ти секунд закроется. В ней применим регулярное срабатывание таймера, оно будет обновлять текущее время на экране каждую секунду. Также применим статическую функцию singleShot() для единичного срабатывания, которое пошлет сигнал для закрытия программы.

Приложение Qt Widgets

Приложение Qt Widgets

При желании его можно оформить, что я собственно и сделал.

Подключаем два заголовочных файла и . Класс QTime содержит метод currentTime(), который возвращает текущее время, оно пригодится нам в программе.

В этом же файле в классе MainWindow объявим указатель закрытого типа(private) на объект класса QTimer

В ней будет храниться указатель на наш таймер.

Объявим закрытый слот updateTime()

Он будет обновлять время на экране.

Весь листинг файла mainwindow.h

В этом файле определим слот updateTime() класса MainWindow

Слот изменяет значение поля text объекта label в нашей форме, помещает в нее значение текущего времени. Статический метод QTime::currentTime() возвращает текущее время, методом toString() мы его преобразовываем в строку, т.к. метод setText(QString arg) принимает на вход только QString. Будем посылать сигнал в этот слот каждую секунду, чтобы обновлялось текущее время на экране.

Далее в конструкторе класса MainWindow создадим новый объект таймера QTimer и передадим его адрес нашей переменной tmr

Зададим интервал таймера в 1 секунду (1 секунда = 1000 миллисекунд)

Соединим сигнал timeout() таймера tmr со слотом updateTime() объекта класса MainWindow

Теперь таймер будет посылать сигнал в наш слот.

Далее сразу же запустим таймер

Метод start() может вызываться с параметром типа int, он задает интервал таймера. Например:

tmr->start(1000);

Таким образом таймер после запуска будет посылать сигнал с интервалом 1000 мс (каждую секунду).

Листинг файла mainwindow.cpp

В нем тайкже подключим заголовочный файл QTimer

Далее после кода, в котором создается обект окна, вызываем статический метод singleShot() класса QTimer.

Первый параметр метода singleShot() задает значение в миллисекундах, по истечении которых будет послан сигнал.

Второй параметр принимает на вход адрес объекта.

В третьем параметре указывается слот входного объекта.

Листинг файла main.cpp

С редактированием кода всё, осталось запустить нашу программу.

После сборки и запуска появляется такое окно

Окно программы

Время обновляется каждую секунду. После пяти секунд программа закрывается.

Итак, мы узнали о классе QTimer, научились создавать новые таймеры и применили эти знания на практике.

Существуют еще один класс QBasicTimer, который обеспечивает события таймера для объектов, но в данной статье не рассмотрен.

Для вас это может быть интересно:

QTimer. Создание таймера и обработка его событий с примером программы. : 12 комментариев

Спасибо! Повторил пример, всё заработало!
Сейчас хочу модифицировать, чтобы по таймеру увеличивался размер окна

кругом срань, хоть один норм пример. Спасибо!

А какой смысл в delete tmr; ?
В данном случае же освобождение памяти берет на себя Qt.

Тоже не вижу смысла в этом, но по правилам хорошего тона вроде бы нужно

Не конектит таймаут и слот. Пишу 5.13.1 на 32 битку

Хороший пример использования QTimer, в своё время до меня долго доходило, т.к. не было нормальных примеров.

Пример некорректный. После вызова tmr->start(0); этот нуль попадает в значение таймера и вызовы следуют каждую миллисекунду.

Спасибо за замечание, подправил пример.

а передачу сигнала timeot от массива таймеров в слот с указанием индекса таймера сделать слабо

Хотел в программе поменять частоту срабатывания таймера с секунды на три. По кнопке сделал функцию:
tmr->stop();
tmr->setInterval(3000);
tmr->start();
Не работает. По-прежнему отсчитывает секунды((

ui->setudUI(this);
ProgressTimer = new QTimer();// или здесь засада

connect (ProgressTimer, SIGNAL(timeout)), this, SLOT(tick() );
ProgressTimer->setInterval(1000);// пока отсчет по секунде
position = 0;
ProgressTimer->start();

>

MainWindow::tick() position++;
if (position > 50) position = 0;>
ui->progressBar->setValue(position);
>

MainWindow::on_verticalSlider_valueChanged(int value) ProgressTimer->setInterval( value );
>

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Читайте также: