[Development] QTimer question
Thiago Macieira
thiago.macieira at intel.com
Wed May 31 01:55:51 CEST 2023
On Tuesday, 30 May 2023 15:52:48 PDT Jaroslaw Kobus via Development wrote:
> I don't know QTimer's internals, so I can't comment on this. However, please
> refer to what the CI machine reports for:
> https://codereview.qt-project.org/c/qt-creator/qt-creator/+/480663/1
After trying myself, it turns out the problem is not QTimer or the event
dispatcher, but the Windows API. The following test:
https://codereview.qt-project.org/c/qt/qtbase/+/480705
passes on Linux (glib and native), macOS but fails on Windows, all of them
Core and Gui.
The difference between those two groups is the use of QTimerEventList. Or, said
differently, retaining the order is a feature of that class. This can be
noticed in the Glib and Cocoa implementations, which have a single timer
source for the underlying processing mechanism and the timeout for that source
is calculated at every loop iteration to be the shortest timeout (the timer
that will activate the soonest).
The Windows implementation, however, creates a Windows timer source per timer
that is registered. It appears that Windows internally stores those sources in
a hash or some other container with arbitrary order, producing things like:
FAIL! : tst_QTimer::singleShotSequentialTimers(25,25,25,25,25,25,50) Compared
values are not the same
Actual (result) : "AFBCDEG"
Expected (expected): "ABCDEFG"
The two most common patterns appear to be complete reversal (FEDCBA) and the
last timer in a given value to come ahead ("AEBCD", "AFBCDE", etc).
> When the target thread is busy, I can't expect the exact accuracy for the
> elapsed timeouts, and therefore I don't know how to interpret the "wakes up
> exactly when you asked it to"?
This may also explain why you're seeing a timeout of 2 happening before 1,
when I can't in my test. Every time there's a step in value, the order gets
retained. That is, for the 1,1,1,2,2,2,2 case, letters D-G never appeared
mixed with A-C; in the 25,25,25,25,25,25,50 case, letter G was always last.
But if the thread got blocked for enough time that further timers expired
before any got handled, then I assume the Windows internals will keep
activating them in arbitrary order.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Cloud Software Architect - Intel DCAI Cloud Engineering
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5152 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20230530/4ef0dc68/attachment.bin>
More information about the Development
mailing list