Der Timer ist sehr ungenau, da er über Windows-Messages getriggert wird. Um wirklich genau zu arbeiten, sollte man
QueryPerformanceCounter nutzen.
Das mit dem Tag kannst du dir vermutlich sparen, da die Funktion nie mehrmals gleichzeitig ausgeführt wird. Hängt damit zusammen, dass der Timer nur eine Windowsmessage abschickt. Wenn du also in den aufgerufenen Prozeduren kein Application.ProcessMessage oder Application.HandleMessages drin hast, dann läuft die Timer-Prozedur nie mehrmals gleichzeitig.