Timers
QObject는 모든 Qt 객체의 베이스 클래스로, Qt에서 기본적인 타이머 지원을 제공합니다. QObject::startTimer ()를 사용하면 밀리초 단위의 간격을 인자로 사용하여 타이머를 시작합니다. 이 함수는 고유한 적분 타이머 ID를 반환합니다. 그런 다음 해당 타이머 ID로 QObject::killTimer()를 명시적으로 호출할 때까지 타이머가 일정한 간격으로 실행됩니다.
타이머 ID를 직접 처리하는 대신 QBasicTimer 을 사용할 수 있습니다. QBasicTimer 은 타이머 ID를 둘러싼 값 클래스, RAII 래퍼입니다. QBasicTimer::start ()로 타이머를 시작하고 QBasicTimer::stop()로 타이머를 중지합니다(후자는 소멸 시에도 호출됨). QBasicTimer 를 사용하려면 클래스( QObject 의 하위 클래스여야 함)에서 timerEvent()를 다시 구현하고 거기서 타이머 이벤트를 처리해야 합니다.
이 메커니즘이 작동하려면 애플리케이션이 이벤트 루프에서 실행되어야 합니다. QApplication::exec ()로 이벤트 루프를 시작합니다. 타이머가 발생하면 애플리케이션은 QTimerEvent 을 전송하고 타이머 이벤트가 처리될 때까지 제어 흐름이 이벤트 루프를 떠납니다. 이는 애플리케이션이 다른 작업을 수행하는 동안에는 타이머가 실행될 수 없음을 의미합니다. 다시 말해, 타이머의 정확도는 애플리케이션의 세분성에 따라 달라집니다.
멀티스레드 애플리케이션에서는 이벤트 루프가 있는 모든 스레드에서 타이머 메커니즘을 사용할 수 있습니다. GUI가 아닌 스레드에서 이벤트 루프를 시작하려면 QThread::exec()를 사용합니다. Qt는 객체의 thread affinity 을 사용하여 QTimerEvent 을 전달할 스레드를 결정합니다. 따라서 객체의 스레드에서 모든 타이머를 시작하고 중지해야 하며, 다른 스레드에 있는 객체의 타이머는 시작할 수 없습니다.
타이머 기능을 위한 기본 API는 QTimer 입니다. QTimer 은 간격을 부호 있는 정수로 저장하며, 이 경우 지원하는 최대 간격은 부호 있는 정수에 들어갈 수 있는 밀리초(실제로는 약 24일의 기간)로 제한됩니다.
Qt 6.8에는 QChronoTimer 클래스가 도입되었습니다. 두 클래스의 주요 차이점은 QChronoTimer 이 더 넓은 간격 범위와 더 높은 정밀도를 지원한다는 것입니다 (std::chrono::nanoseconds
). QTimer 의 경우 최대 지원 간격은 ±24일인 반면 QChronoTimer 의 경우 ±292 년입니다. 밀리초 분해능과 ±24일 범위만 필요한 경우에는 QTimer 을 계속 사용할 수 있습니다.
타이머의 정확도는 기본 운영 체제에 따라 다릅니다. Windows 2000의 정확도는 15밀리초이며, 테스트한 다른 시스템은 1밀리초 간격을 처리할 수 있습니다.
QChronoTimer 는 타이머가 실행될 때 신호를 방출하는 일반 타이머를 제공하며, QObject 에서 상속되어 대부분의 Qt 프로그램의 소유권 구조에 잘 맞습니다. 일반적인 사용 방법은 다음과 같습니다:
QChronoTimer *timer = new QChronoTimer(1s, this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->start(); QChronoTimer *timer = new QChronoTimer(this); connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing); timer->setInterval(1s); timer->start();
QChronoTimer 객체를 this
객체의 자식으로 만들어 this
가 소멸되면 타이머도 소멸되도록 합니다. 그런 다음 timeout() 신호가 작업을 수행할 슬롯에 연결되고, 타이머 간격은 생성자에게 전달되거나 나중에 setInterval()을 사용하여 설정할 수 있습니다.
QChronoTimer 는 싱글샷 타이머를 위한 정적 함수도 제공합니다. 예를 들어
MyWidget widget; QChronoTimer::singleShot(200ms, &widget, &MyWidget::updateCaption);
이 코드 줄이 실행되고 200ms 후에 updateCaption()
슬롯이 호출됩니다.
QChronoTimer 이 작동하려면 애플리케이션에 이벤트 루프가 있어야 합니다. 즉, QCoreApplication::exec()을 어딘가에서 호출해야 합니다. 타이머 이벤트는 이벤트 루프가 실행되는 동안에만 전달됩니다.
멀티스레드 애플리케이션에서는 이벤트 루프가 있는 모든 스레드에서 QChronoTimer 을 사용할 수 있습니다. GUI가 아닌 스레드에서 이벤트 루프를 시작하려면 QThread::exec()를 사용합니다. Qt는 타이머의 thread affinity 를 사용하여 timeout() 신호를 방출할 스레드를 결정합니다. 따라서 해당 스레드에서 타이머를 시작하고 중지해야 하며, 다른 스레드에서 타이머를 시작할 수는 없습니다.
아날로그 시계 예시는 QChronoTimer 을 사용하여 위젯을 일정한 간격으로 다시 그리는 방법을 보여줍니다. AnalogClock
의 구현에서 가져온 것입니다:
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent) { auto *timer = new QChronoTimer(1s, this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update)); timer->start(); ... ... setWindowTitle(tr("Analog Clock")); resize(200, 200); }
매 초마다 QChronoTimer 은 QWidget::update() 슬롯을 호출하여 시계의 디스플레이를 새로 고칩니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.