diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2024-02-14 11:31:36 -0800 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2024-03-13 17:29:12 -0800 |
commit | afa86c60e6b6513c5c34b3832a5ece526c071c3f (patch) | |
tree | 4c3fa9df61324505d751e9b25cb61c1458ce47e6 /src/corelib/kernel | |
parent | 7ce75b1a2bd9f22a7b2b83d48df875c68a47b390 (diff) |
QTimerInfo: correct CoarseTimer beyond the [20ms,20s] range earlier
Simplifies some code.
Pick-to: 6.7
Change-Id: I83dda2d36c904517b3c0fffd17b3d18f2dfbc2b3
Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qtimerinfo_unix.cpp | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp index 484ca89945..da570eded2 100644 --- a/src/corelib/kernel/qtimerinfo_unix.cpp +++ b/src/corelib/kernel/qtimerinfo_unix.cpp @@ -286,8 +286,19 @@ void QTimerInfoList::registerTimer(int timerId, qint64 interval, Qt::TimerType t void QTimerInfoList::registerTimer(int timerId, milliseconds interval, Qt::TimerType timerType, QObject *object) { - QTimerInfo *t = new QTimerInfo(timerId, interval, timerType, object); + // correct the timer type first + if (timerType == Qt::CoarseTimer) { + // this timer has up to 5% coarseness + // so our boundaries are 20 ms and 20 s + // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision + // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer + if (interval >= 20s) + timerType = Qt::VeryCoarseTimer; + else if (interval <= 20ms) + timerType = Qt::PreciseTimer; + } + QTimerInfo *t = new QTimerInfo(timerId, interval, timerType, object); steady_clock::time_point expected = updateCurrentTime() + interval; switch (timerType) { @@ -298,23 +309,10 @@ void QTimerInfoList::registerTimer(int timerId, milliseconds interval, break; case Qt::CoarseTimer: - // this timer has up to 5% coarseness - // so our boundaries are 20 ms and 20 s - // below 20 ms, 5% inaccuracy is below 1 ms, so we convert to high precision - // above 20 s, 5% inaccuracy is above 1 s, so we convert to VeryCoarseTimer - if (interval >= 20s) { - t->timerType = Qt::VeryCoarseTimer; - } else { - t->timeout = expected; - if (interval <= 20ms) { - t->timerType = Qt::PreciseTimer; - // no adjustment is necessary - } else if (interval <= 20s) { - calculateCoarseTimerTimeout(t, currentTime); - } - break; - } - Q_FALLTHROUGH(); + t->timeout = expected; + calculateCoarseTimerTimeout(t, currentTime); + break; + case Qt::VeryCoarseTimer: t->interval = roundToSecs(t->interval); const auto currentTimeInSecs = floor<seconds>(currentTime); |