I draw by elapsed time/system time. Every game state gets a timestamp containing the system time to which it corresponds, and the renderer interpolates (using the stored velocities but no collisions) from the state it receives to the current system time.
How can it be a problem with threading? Didn't you say it was just as bad without threading? Anyways, I use double buffered state, so the render thread only has to lock the front buffer while render commands are submitted. At the same time the physics thread can continue processing using the back buffer. As soon as it's done with that, it will try to lock the front buffer and swap buffers (a pointer swap), so all in all, the time any thread waits for the other thread should be
very short. Not enough to create any visible jumps.
Anyways, I just had an interesting idea for a new pong variant:
Electrostatic Field Pong
What do you think? Worth the effort?