ТаймерыQObject, базовый класс всех объектов Qt, предоставляет базовую поддержку таймеров в Qt. С помощью QObject::startTimer() вы запускаете таймер с интервалом в миллисекундах в качестве аргумента. Функция возвращает уникальный целочисленный идентификатор таймера. Таймер будет срабатывать через равные интервалы времени до тех пор, пока вы явно не вызовите QObject::killTimer() с идентификатором таймера. Для работы данного механизма приложение должно быть запущено в цикле обработки событий. Вы запускаете цикл обработки событий с помощью QApplication::exec(). Когда таймер срабатывает, приложение отправляет QTimerEvent, и поток управления передаётся из цикла обработки событий пока обрабатывается событие таймера. Это предполагает, что таймер не может сработать в то время как ваше приложение занято выполнением чего-либо еще. Другими словами: точность таймеров зависит от степени структурирования (granularity) вашего приложения. В многопотоковых приложениях вы можете использовать механизм таймера в любом потоке, в котором имеется цикл обработки событий. Для запуска цикла обработки событий из неграфического (non-GUI) потока используйте QThread::exec(). Qt использует принадлежность потоку объекта для определения, в какой поток будет доставлено QTimerEvent. Из-за этого вы должны запускать и останавливать все таймеры в потоке объекта; невозможно запускать таймеры для объектов в другом потоке. Верхний предел для значения интервала определяется количеством миллисекунд, которые можно указать в целом числе со знаком (фактически, этот период немногим больше 24 дней). Точность зависит от базовой операционной системы. У Windows 2000 точность равна 15 миллисекундам; другие системы, которые мы тестировали, могут обрабатывать интервалы в 1 миллисекунду. Главным API для функциональности таймера является QTimer. Этот класс предоставляет регулярные таймеры, которые отправляют сигнал когда срабатывает, и унаследован от QObject, поэтому он вписывается в структуру владения большинства программ с ГПИ. Обычный способ использования выглядит примерно так: QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption())); timer->start(1000); Объект QTimer создан дочерним по отношению к текущему виджету - таким образом когда удаляется этот виджет, таймер также удаляется. Далее, его сигнал timeout() соединён со слотом, который выполняет работу, запускается со значением 1000 миллисекунд, указывающим на тайм-аут в 1 секунду. Также QTimer предоставляет статическую функцию для однократных (single-shot) таймеров. Например: QTimer::singleShot(200, this, SLOT(updateCaption())); Слот updateCaption() будет вызван через 200 миллисекунд (0.2 секунды) после выполнения этой строки кода. Для работы QTimer в вашем приложении должен быть цикл обработки событий; то есть, вы должны где-то вызывать QCoreApplication::exec(). События таймера будут доставляться только пока работает цикл обработки событий. В многопоточных приложениях вы можете использовать QTimer в любом потоке, в котором имеется цикл обработки событий. Для запуска из неграфического потока цикла обработки событий используйте QThread::exec(). Qt использует принадлежность потоку таймера для определения, в какой поток будет отправлен сигнал timeout(). Из-за этого вы должны запускать и останавливать таймер в его собственном потоке; невозможно запустить таймер из другого потока. Пример "Analog Clock" показывает, как использовать 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. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |