What does your message pump look like? I bet you're not processing all messages each frame, and you're just processing one message per tick. Especially if it only does it after a while.
Here is the message pump I use for my games djtaylor
bool bQuit = false;
//message pump
do
{
//look for a message
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//check that we arent quitting
if(msg.message==WM_QUIT)
bQuit = true;
//translate message
TranslateMessage(&msg);
//dispatch message
DispatchMessage(&msg);
}
if(bQuit == false)
{
MyGame.RunFrame();
}
} while(!bQuit);
Edit: sorry formating is a bit off there.