The method you use is not time-based movement, with time-based movement you don't wait for a certain time to pass but update movements each frame based on time between the current and the last frame. And many people still use functions like GetTickCount which are not fine-grained enough for measuring speeds at high frame rates (GetTickCount works on milliseconds and with frametimes below 10ms won't give you correct results) and may cause troubles on modern multi-core systems.

So I added the above note, as I also had some problems with correct timing after switching to a dual-core system, as it's possible that your thread get's moved to another core without noticing and you then could have a time-gap. So I e.g. stopped using the OnIdle-Event but rather start up my own loop after game init and do timing only with high-performance funtions like QueryPerformanceCounter.

If you need more information, take a look at this link from Microsoft that shows how to do correct timing on multi-core systems.