Cómo conseguir tiempos de espera exactos en Windows.

No utilizando un « timer » tradicional, cuya exactitud no es muy buena debida a dos causas: la naturaleza multimedia de Windows y el hecho de que la señal se reciba mediante un mensaje que ha de esperar en una cola hasta que sea procesado.

Utilizar un thread o hilo de ejecución independiente puede ser una solución, casi seguro que obtendrás mayor exactitud en las esperas. De cualquier forma, no es cierto que los threads de una aplicación se ejecuten de forma simultánea, de hecho el sistema va interrumpiendo los threads de cada una de las aplicaciones para ir pasando el control de un thread a otro y permitir ese efecto de multitarea. La única forma real de ejecución paralela se daría en un ordenador que contase con varios procesadores y con un sistema operativo preparado para multiproceso. Es decir, que si trabajamos en Win9x nada de nada.

Una solución alternativa, más simple que usar varios threads y más exacta que el uso de un timer, consiste en usar las funciones multimedia para eventos temporizados. Éstas permiten generar un evento de reloj que no se traduce en un mensaje, sino en una llamada directa a una función de nuestro programa, y además con una exactitud mucho mejor. Según la documentación, estos servicios dan la mayor exactitud que permita el hardware.

Puedes usar timeGetDevCaps() para saber la exactitud máxima que es posible utilizar. A continuación, usando timeBeginPeriod() y timeEndPeriod() para establecer el rango de exactitud que tolerarías en tu aplicación. Por último estableces el elemento mediante la función timeSetEvent(). Ésta toma como
uno de los parámetros la dirección de la función a la que se llamará.