[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:
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