If some jitter is acceptable one can use MSEgui "ttimer". The "interval" value is in microseconds and the moment of next trigger is recalculated at every expire in order to produce the correct frequency.
On Linux with low load the precision of the individual triggers normally is better than a millisecond.
On Windows one can call "application.beginhighrestimer()", then the MSEgui timing system will use the multimedia timer with 1 millisecond granularity instead of the normal Windows system tick.