이 페이지에서

QChronoTimer Class

QChronoTimer 클래스는 반복 타이머와 단일 타이머 기능을 제공합니다. 더 보기...

헤더: #include <QChronoTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
다음부터: Qt 6.8
상속: QObject

속성

공개 함수

QChronoTimer(QObject *parent = nullptr)
QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
virtual ~QChronoTimer() override
QBindable<bool> bindableActive()
QBindable<std::chrono::nanoseconds> bindableInterval()
QBindable<bool> bindableSingleShot()
QBindable<Qt::TimerType> bindableTimerType()
QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Qt::TimerId id() const
std::chrono::nanoseconds interval() const
bool isActive() const
bool isSingleShot() const
std::chrono::nanoseconds remainingTime() const
void setInterval(std::chrono::nanoseconds nsec)
void setSingleShot(bool singleShot)
void setTimerType(Qt::TimerType atype)
Qt::TimerType timerType() const

공개 슬롯

void start()
void stop()

신호

void timeout()

재구현된 보호 함수

virtual void timerEvent(QTimerEvent *e) override

상세 설명

QChronoTimer 클래스는 타이머를 위한 고수준 프로그래밍 인터페이스를 제공합니다. 이를 사용하려면, 생성자에 간격을 전달하거나 생성 후 setInterval()를 사용하여 간격을 설정함으로써 QChronoTimer를 생성하고, timeout() 신호를 적절한 슬롯에 연결한 다음, start()를 호출하면 됩니다. 그 후부터 타이머는 일정한 간격으로 timeout() 신호를 발생시킵니다. 예를 들면 다음과 같습니다.

        auto *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();

setSingleShot(true)를 호출하면 타이머가 단 한 번만 작동하도록 설정할 수 있습니다.

참고: QChronoTimer에는 singleShot() 정적 메서드가 없습니다. QTimer 의 singleShot() 메서드는 이미 chrono 유형 및 나노초 단위의 분해능을 지원하기 때문입니다.

멀티스레드 애플리케이션에서는 이벤트 루프가 있는 모든 스레드에서 QChronoTimer를 사용할 수 있습니다. GUI가 아닌 스레드에서 이벤트 루프를 시작하려면 QThread::exec()를 사용하십시오. Qt는 타이머의 ` thread affinity `를 사용하여 어떤 스레드가 ` timeout()` 신호를 발생시킬지 결정합니다. 이 때문에 타이머는 해당 스레드 내에서 시작하고 중지해야 하며, 다른 스레드에서 타이머를 시작하는 것은 불가능합니다.

특별한 경우로, 타임아웃이 0ns 인 QChronoTimer는 가능한 한 빨리 타임아웃이 발생하지만, 제로 타이머와 다른 이벤트 소스 간의 처리 순서는 명시되지 않습니다. 제로 타이머를 사용하면 사용자 인터페이스의 반응성을 유지하면서 작업을 수행할 수 있습니다:

        // The default interval is 0ns
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();

그 시점부터 ` processOneThing() `가 반복적으로 호출됩니다. Qt가 사용자 인터페이스에 이벤트를 전달하고, 모든 작업이 완료되는 즉시 타이머를 중지할 수 있도록, 이 함수는 항상 빠르게 반환되도록(예: 데이터 항목 하나를 처리한 후) 작성되어야 합니다. 이는 GUI 애플리케이션에서 부하가 큰 작업을 구현하는 전통적인 방식이지만, 멀티스레딩이 더 많은 플랫폼에서 지원됨에 따라, 현대적인 대안으로는 GUI(메인) 스레드 이외의 스레드에서 부하가 큰 작업을 수행하는 것입니다. Qt에는 이를 구현하는 데 사용할 수 있는 ` QThread ` 클래스가 있습니다.

정확도와 타이머 분해능

타이머의 정확도는 기본 운영 체제와 하드웨어에 따라 달라집니다. 대부분의 플랫폼은 타이머에 대해 나노초 단위의 정밀도를 요청하는 기능을 지원하지만(예: libc의 ` nanosleep`), 실제 상황에서는 타이머의 정확도가 이 분해능과 정확히 일치하지 않는 경우가 많습니다.

timer type 를 설정하여 QChronoTimer가 시스템에 어떤 정밀도를 요청할지 지정할 수 있습니다.

Qt::PreciseTimer 의 경우, QChronoTimer는 정밀도를 1ns 로 유지하려고 시도합니다. 정밀 타이머는 예상보다 일찍 타임아웃되지 않습니다.

Qt::CoarseTimer 및 Qt::VeryCoarseTimer 유형의 경우, QChronoTimer는 해당 유형의 허용 오차 범위 내에서 예상보다 일찍 깨어날 수 있습니다:

시스템이 바쁘거나 요청된 정확도를 제공할 수 없는 경우, 모든 타이머 유형이 예상보다 늦게 타임아웃될 수 있습니다. 이러한 타임아웃 초과 상황에서, Qt는 여러 타임아웃이 만료되었더라도 timeout()을 단 한 번만 발생시킨 후 원래의 간격을 재개합니다.

QChronoTimer의 대안

QChronoTimer는 나노초 단위의 분해능과 ±292년의 범위를 제공합니다(간격이 std::numeric_limits<int>::max() 보다 길 경우 정수 오버플로우 발생 가능성이 줄어듭니다). 밀리초 단위의 분해능과 ±24일의 범위만 필요한 경우, 기존의 QTimer 클래스를 계속 사용할 수 있습니다.

또 다른 대안은 자신의 클래스( QObject 의 서브클래스여야 함)에서 QObject::timerEvent() 메서드를 재구현하고, 다음 방법 중 하나를 사용하는 것입니다:

  • QBasicTimer 를 사용하는 방법입니다. 이는 타이머 ID를 감싸는 경량 값 클래스입니다. QBasicTimer::start()로 타이머를 시작하고, QBasicTimer::stop()로 중지할 수 있습니다. 재구현한 timerEvent()에서 이벤트를 처리할 수 있습니다.
  • 보다 저수준의 방법으로는 타이머 ID를 직접 조작하는 것이 있습니다. 타이머를 시작하려면 QObject::startTimer()를 호출하고 반환된 ID를 저장합니다. 타이머를 중지하려면 QObject::killTimer()를 호출합니다. 재구현한 timerEvent()에서 이벤트를 처리할 수 있습니다. 이 방법은 일반적으로 QBasicTimer 를 사용하는 것보다 번거롭습니다.

timerEvent()을 사용할 때의 단점은 단일 실행 타이머나 시그널과 같은 일부 고급 기능이 지원되지 않는다는 점입니다.

일부 운영 체제에서는 사용할 수 있는 타이머의 수를 제한하는데, Qt는 이러한 제한을 최대한 우회하기 위해 노력합니다.

QBasicTimer, QTimerEvent, QObject::timerEvent(), 타이머 및 아날로그 시계도 참조하십시오 .

속성 문서

[bindable read-only] active : bool

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 부울 속성은 타이머가 실행 중일 경우 ` true `이며, 그렇지 않은 경우 ` false`입니다.

액세스 함수:

bool isActive() const

[bindable] interval : std::chrono::nanoseconds

참고: 이 속성은 QProperty 바인딩을 지원합니다.

이 속성은 타임아웃 간격을 저장합니다.

이 속성의 기본값은 ` 0ns`입니다.

타임아웃이 0ns 인 QChronoTimer 는 윈도우 시스템의 이벤트 큐에 있는 모든 이벤트가 처리되는 즉시 타임아웃됩니다.

실행 중인 타이머의 간격을 설정하면 간격이 변경되고, stop() 및 start()이 타이머를 재설정하며, 새로운 id()을 획득합니다. 타이머가 실행 중이 아닌 경우, 간격만 변경됩니다.

Qt 6.10부터는 음수의 간격을 설정하면 런타임 경고가 발생하고 값이 1ms로 재설정됩니다. Qt 6.10 이전 버전에서는 Qt Timer에서 음수 간격을 설정할 수 있었지만, 예상치 못한 방식으로 동작했습니다(예를 들어, 타이머가 실행 중일 경우 중지되거나 아예 시작되지 않는 경우 등).

액세스 함수:

std::chrono::nanoseconds interval() const
void setInterval(std::chrono::nanoseconds nsec)

singleShot도 참조하십시오 .

[read-only] remainingTime : std::chrono::nanoseconds

이 속성은 남은 시간을 나타냅니다.

타임아웃까지 남은 시간을 반환합니다.

타이머가 비활성화된 경우, 반환되는 지속 시간은 음수입니다.

타이머가 만료된 경우, 반환되는 기간은 ` 0ns`가 됩니다.

액세스 함수:

std::chrono::nanoseconds remainingTime() const

interval도 참조하십시오 .

[bindable] singleShot : bool

참고: 이 속성은 ‘ QProperty ’ 바인딩을 지원합니다.

이 속성은 타이머가 단일 실행 타이머인지 여부를 나타냅니다.

단일 실행 타이머는 한 번만 작동하는 반면, 단일 실행이 아닌 타이머는 interval 마다 작동합니다.

이 속성의 기본값은 false 입니다.

액세스 함수:

bool isSingleShot() const
void setSingleShot(bool singleShot)

interval도 참조하십시오 .

[bindable] timerType : Qt::TimerType

참고: 이 속성은 QProperty 바인딩을 지원합니다.

타이머의 정확도를 제어합니다.

이 속성의 기본값은 ` Qt::CoarseTimer`입니다.

액세스 함수:

Qt::TimerType timerType() const
void setTimerType(Qt::TimerType atype)

Qt::TimerType도 참조하십시오 .

멤버 함수 문서

[explicit] QChronoTimer::QChronoTimer(QObject *parent = nullptr)

지정된 ` parent`을 사용하여, 기본 간격인 ` 0ns`을 적용해 타이머를 생성합니다.

[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)

주어진 ` parent`를 사용하여, ` nsec` 간격으로 타이머를 생성합니다.

[override virtual noexcept] QChronoTimer::~QChronoTimer()

타이머를 제거합니다.

template <typename Functor> QMetaObject::Connection QChronoTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)

timeout() 신호에서 slot 로 연결을 생성하여, 연결 유형 connectionType 을 사용하여 context 의 특정 이벤트 루프에 배치하고, 해당 연결에 대한 핸들을 반환합니다.

이 메서드는 편의성을 위해 제공됩니다. 다음 호출과 동일합니다:

QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);

QObject::connect() 및 timeout()도 참조하십시오 .

Qt::TimerId QChronoTimer::id() const

타이머가 실행 중이면 타이머 ID를 나타내는 ` Qt::TimerId `를 반환하고, 그렇지 않으면 ` Qt::TimerId::Invalid`를 반환합니다.

Qt::TimerId도 참조하십시오 .

bool QChronoTimer::isActive() const

타이머가 실행 중이면 ` true `을 반환하고, 그렇지 않으면 ` false`을 반환합니다.

참고: active 속성에 대한게터 함수입니다.

[slot] void QChronoTimer::start()

interval 에 지정된 타임아웃을 사용하여 타이머를 시작하거나 다시 시작합니다.

타이머가 이미 실행 중인 경우, 해당 타이머는 ` stopped `로 설정된 후 다시 시작됩니다. 이 경우 타이머의 ` id()` 값도 변경됩니다.

singleShot 가 true인 경우, 타이머는 한 번만 활성화됩니다.

[slot] void QChronoTimer::stop()

타이머를 중지합니다.

start()도 참조하십시오 .

[private signal] void QChronoTimer::timeout()

이 신호는 타이머가 만료될 때 전송됩니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수는 있지만, 사용자가 직접 발생시킬 수는 없습니다.

interval, start() 및 stop()도 참조하십시오 .

[override virtual protected] void QChronoTimer::timerEvent(QTimerEvent *e)

QObject::timerEvent(QTimerEvent *event)를 재구현합니다.

© 2026 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.