2009-04-27 19 views
9

Ho appena visto this question, dove una delle risposte indica che System.Diagnostics.Stopwatch deve essere utilizzato solo per diagnosticare le prestazioni e non nel codice di produzione.Timer di precisione in .NET

In tal caso, quale sarebbe il modo migliore per ottenere un timing preciso in .NET? Sono attualmente nelle fasi iniziali della creazione di un semplice sequencer MIDI che utilizza la funzionalità di uscita MIDI di NAudio. Mi piacerebbe essere in grado di inviare messaggi MIDI allineati a (diciamo) 1/10 con il minimo jitter possibile. È fattibile, o cose come il cambio di contesto rovinerebbe la mia giornata?

Attualmente ho del codice in un'app console che chiama continuamente Stopwatch e calcola il jitter durante la generazione di un flusso di 1/16 a 150 bpm. Il jitter è molto basso in questa situazione. Tuttavia, lo trasferirò su un'altra discussione, quindi non so se rimarrà il caso.

risposta

6

Se non ti dispiace P/Invoke, è possibile utilizzare QueryPerformanceCounter: http://www.eggheadcafe.com/articles/20021111.asp

+0

+1. I contatori delle prestazioni ti daranno il contatore più preciso e leggero che riesci a trovare. Non è così semplice come altre implementazioni. –

+7

Da quanto ho capito, Stopwatch utilizza QueryPerformanceCounter se disponibile. Non ho nulla contro QPC e l'ho usato in applicazioni C++/Win32 prima, ma non so cosa succede nei livelli più bassi del CLR quindi mi chiedevo se c'era un modo migliore. – geofftnz

+0

Hai ragione, Cronometro utilizza QueryPerformanceCounter - non me ne ero reso conto. Dopo aver letto l'altra domanda, penso che l'unica ragione per cui qualcuno ha consigliato di non utilizzare Cronometro in produzione era che portava un sovraccarico, ma immagino sia piuttosto piccolo e facilmente misurabile. – RichieHindle

1

Si potrebbe anche usare il nativo API di streaming MIDI. Non penso che sia in NAudio, ma si potrebbe guardare il Toolkit C# Midi per vedere se quello lo supporta. In alternativa, hai due esempi su come eseguire l'API MIDI nativo P/Invoke e puoi eseguire il tuo ...

+0

ci sono alcuni wrapper per le API MIDI di streaming in NAudio, ma non sono ancora stati messi alla prova. Tuttavia, potrebbe indicarti la giusta direzione –

0

Windows multimedia timer afferma che consente alle applicazioni di pianificare eventi timer con la massima risoluzione (o precisione) possibile per l'hardware piattaforma."

L'applicazione che utilizza come esempio è un sequencer MIDI.