Spec-Zone.ru › Qt 5.11

Таймеры

QObject, базовый класс всех объектов Qt, предоставляет основную поддержку таймеров в Qt. С помощью QObject::startTimer() вы запускаете таймер с интервалом в миллисекундах в качестве аргумента. Функция возвращает уникальный идентификатор таймера. Таймер будет срабатывать с регулярными интервалами до тех пор, пока вы явно не вызовете QObject::killTimer() с идентификатором таймера.

Для работы этого механизма приложение должно работать в цикле событий. Вы запускаете цикл событий с помощью QApplication::exec(). Когда таймер срабатывает, приложение отправляет QTimerEvent, и поток управления покидает цикл событий до обработки события таймера. Это подразумевает, что таймер не может сработать, пока ваше приложение занято чем-то другим. Другими словами: точность таймеров зависит от точности вашего приложения.

В многопоточных приложениях вы можете использовать механизм таймера в любом потоке, который имеет цикл событий. Чтобы запустить цикл событий из потока, отличного от GUI, используйте QThread::exec(). Qt использует аффинити потока объекта thread affinity для определения, какой поток будет доставлять QTimerEvent. По этой причине вы должны запускать и останавливать все таймеры в потоке объекта; невозможно запустить таймеры для объектов в другом потоке.

Верхний предел для значения интервала определяется количеством миллисекунд, которое может быть указано в знаковом целочисленном значении (на практике это период чуть более 24 дней). Точность зависит от используемой операционной системы. Windows 2000 имеет точность 15 миллисекунд; другие системы, которые мы тестировали, могут обрабатывать интервалы в 1 миллисекунду.

Основной API для функциональности таймера — QTimer. Этот класс предоставляет регулярные таймеры, которые генерируют сигнал при срабатывании таймера, и наследует QObject, чтобы он хорошо вписывался в структуру владения большинства программ GUI. Обычный способ использования его такой:

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
    timer->start(1000);

Объект QTimer превращается в дочерний элемент этого виджета, чтобы при удалении этого виджета удалялся и таймер. Затем его сигнал timeout() подключается к слоту, который будет выполнять работу, он запускается со значением 1000 миллисекунд, указывая, что он будет таймаутировать каждую секунду.

QTimer также предоставляет статическую функцию для таймеров с однократным срабатыванием. Например:

    QTimer::singleShot(200, this, SLOT(updateCaption()));

Через 200 миллисекунд (0,2 секунды) после выполнения этой строки кода, будет вызван слот updateCaption().

Для работы QTimer необходимо иметь цикл событий в вашем приложении; то есть, вы должны вызвать QCoreApplication::exec() где-то. События таймера будут доставляться только во время работы цикла событий.

В многопоточных приложениях вы можете использовать QTimer в любом потоке, который имеет цикл событий. Чтобы запустить цикл событий из потока, отличного от GUI, используйте QThread::exec(). Qt использует аффинити таймера thread affinity для определения, какой поток будет излучать сигнал timeout(). По этой причине вы должны запускать и останавливать таймер в его потоке; невозможно запустить таймер из другого потока.

Пример Аналоговых часов демонстрирует, как использовать QTimer для перерисовки виджета с регулярными интервалами. Из реализации примера AnalogClock:

AnalogClock::AnalogClock(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
    ...
}

Каждую секунду QTimer будет вызывать слот QWidget::update() для обновления отображения часов.

Если у вас уже есть подкласс QObject и вам нужна простая оптимизация, вы можете использовать QBasicTimer вместо QTimer. С QBasicTimer вам необходимо переопределить timerEvent() в вашем подклассе QObject и обработать таймаут там. Пример Wiggly демонстрирует, как использовать QBasicTimer.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/timers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API