Patrice,
I regret to say that yours
is not a solution. It keeps working even when the animation worker thread is not launched at all.
All timing is still done by the old Windows timer rather than its replacement (the worker thread animation loop), and when the thread isn't running, its otherwise excessive, interfering and meaningless extra refreshes do not overload the renderer any more and the CPU usage drops to its normal ca. 30%, of which ObjReader's contribution is only ca. 25%.
A gl_DrawScene() redraw should normally occur only when there are no other messages pending in the message pump except one most recent WM_TIMER message. This is why the timer message's
low priority is so important for the whole engine to work unstressfully on the CPU.
The Animate loop
must replace the old Windows timer entirely. Everything that worked based on that timer
must now work exclusively based on the Animate loop alone whose messages should have the exact same low priority as the WM_TIMER messages they now replace. The whole purpose of the Animate loop is to be able to do what the Windows timer did but potentially at a much higher frequency that the Windows timer is never able to deliver.
Bottom line is, the old timer
must be eliminated from the new code entirely.