diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qnamespace.qdoc | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_win.cpp | 23 |
2 files changed, 19 insertions, 10 deletions
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 58ca8d312e..dbc399809f 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -2875,4 +2875,10 @@ \value PreciseTimer Precise timers try to keep millisecond accuracy \value CoarseTimer Coarse timers try to keep accuracy within 5% of the desired interval \value VeryCoarseTimer Very coarse timers only keep full second accuracy + + On Windows, Qt will use Windows's Multimedia timer facility (if available) + for Qt::PreciseTimer and normal Windows timers for Qt::CoarseTimer and + Qt::VeryCoarseTimer. The interval for Qt::VeryCoarseTimer is rounded to the + nearest full second (e.g. an interval of 23500ms will be rounded to + 24000ms, and 20300ms to 20000ms). */ diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index b52a4decac..41b1909bf1 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -530,18 +530,21 @@ void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t) Q_Q(QEventDispatcherWin32); int ok = 0; - if (t->interval > 20 || !t->interval || !qtimeSetEvent) { + uint interval = t->interval; + if (interval == 0u) { + // optimization for single-shot-zero-timer + QCoreApplication::postEvent(q, new QZeroTimerEvent(t->timerId)); ok = 1; - if (!t->interval) // optimization for single-shot-zero-timer - QCoreApplication::postEvent(q, new QZeroTimerEvent(t->timerId)); - else - ok = SetTimer(internalHwnd, t->timerId, (uint) t->interval, 0); - } else { - ok = t->fastTimerId = qtimeSetEvent(t->interval, 1, qt_fast_timer_proc, (DWORD_PTR)t, + } else if ((interval < 20u || t->timerType == Qt::PreciseTimer) && qtimeSetEvent) { + ok = t->fastTimerId = qtimeSetEvent(interval, 1, qt_fast_timer_proc, (DWORD_PTR)t, TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS); - if (ok == 0) { // fall back to normal timer if no more multimedia timers available - ok = SetTimer(internalHwnd, t->timerId, (uint) t->interval, 0); - } + } else if (interval >= 20000u || t->timerType == Qt::VeryCoarseTimer) { + // round the interval, VeryCoarseTimers only have full second accuracy + interval = ((interval + 500)) / 1000 * 1000; + } + if (ok == 0) { + // user normal timers for (Very)CoarseTimers, or if no more multimedia timers available + ok = SetTimer(internalHwnd, t->timerId, interval, 0); } if (ok == 0) |