2009-04-27 7 views
9

Acabo de ver this question, donde una de las respuestas indica que System.Diagnostics.Stopwatch solo debe utilizarse para diagnosticar el rendimiento y no en el código de producción.Tiempo de precisión en .NET

En ese caso, ¿cuál sería la mejor manera de obtener sincronización de precisión en .NET? Actualmente estoy en las primeras etapas de construir un secuenciador MIDI muy simple usando la funcionalidad de salida MIDI de NAudio. Me gustaría poder enviar mensajes MIDI alineados a (digamos) 1/10s con la menor inestabilidad posible. ¿Es esto factible o las cosas como el cambio de contexto arruinarán mi día?

Actualmente tengo un código en una aplicación de consola que llama continuamente a Stopwatch y calcula el jitter al generar una secuencia de 1/16 notas a 150bpm. La inestabilidad es muy baja en esta situación. Sin embargo, voy a pasar esto a otro hilo, por lo que no sé si ese será el caso.

Respuesta

6

Si no le importa P/Invoke, puede utilizar QueryPerformanceCounter: http://www.eggheadcafe.com/articles/20021111.asp

+0

+1. Los contadores de rendimiento le proporcionarán el contador más preciso y liviano que pueda encontrar. Simplemente no es tan sencillo como otras implementaciones. –

+7

Por lo que entiendo, Cronómetro utiliza QueryPerformanceCounter si está disponible. No tengo nada en contra de QPC y lo he usado en aplicaciones C++/Win32 antes, sin embargo, no sé lo que sucede en los niveles inferiores de la CLR, así que me preguntaba si habría una mejor manera. – geofftnz

+0

Tiene razón, Cronómetro utiliza QueryPerformanceCounter - No me había dado cuenta. Después de leer la otra pregunta, creo que la única razón por la que alguien me recomendó no usar Cronómetro en producción fue que lleva un poco de sobrecarga, pero imagino que es bastante pequeña y fácil de medir. – RichieHindle

1

También puede utilizar la API de streaming MIDI nativo. No creo que esté en NAudio, pero podría consultar el C# Midi Toolkit para ver si ése lo admite. De lo contrario, tiene dos ejemplos de cómo hacer P/Invoke API nativa y puede hacer su propio ...

+0

hay algunas envolturas para la transmisión de MIDI API en NAudio, pero todavía no se han puesto a prueba. Aún así, podría apuntarle en la dirección correcta –

0

Windows multimedia timer indica que permite a las aplicaciones programar eventos del temporizador con la mayor resolución (o precisión) posible para el hardware plataforma."

La aplicación que utiliza como ejemplo es un secuenciador MIDI.

Cuestiones relacionadas