2009-04-27 16 views
9

Właśnie widziałem this question, gdzie jedna z odpowiedzi wskazuje, że System.Diagnostics.Stopwatch powinien być używany tylko do diagnozowania wydajności, a nie w kodzie produkcyjnym.Precyzyjna synchronizacja w .NET

W takim przypadku, jaki byłby najlepszy sposób uzyskania precyzji taktowania w .NET? Obecnie jestem na wczesnym etapie budowania bardzo prostego sekwencera MIDI przy użyciu funkcji MIDI-out z NAudio. Chciałbym móc wysyłać komunikaty MIDI wyrównane do (powiedzmy) 1/10 z jak najmniejszym jitterem. Czy to możliwe, czy też takie zmiany, jak zmiana kontekstu, zrujnują mi dzień?

Obecnie mam trochę kodu w aplikacji konsolowej, która ciągle dzwoni pod numer Stopwatch i oblicza jitter podczas generowania strumienia 1/16 nut przy 150 obr./min. W tej sytuacji fluktuacja jest bardzo niska. Jednak przeniesię to do innego wątku, więc nie wiem, czy to pozostanie.

Odpowiedz

6

Jeśli nie przeszkadza P/Invoke, można użyć QueryPerformanceCounter: http://www.eggheadcafe.com/articles/20021111.asp

+0

+1. Liczniki wydajności zapewniają najbardziej precyzyjny i najlżejszy licznik, jaki możesz znaleźć. To po prostu nie jest tak proste, jak inne implementacje. –

+7

Z tego co rozumiem, Stoper używa QueryPerformanceCounter, jeśli jest dostępny. Nie mam nic przeciwko QPC i użyłem go wcześniej w aplikacjach C++/Win32, jednak nie wiem, co dzieje się na niższych poziomach CLR, więc zastanawiałem się, czy istnieje lepszy sposób. – geofftnz

+0

Masz rację, Stoper używa QueryPerformanceCounter - nie zdawałem sobie sprawy. Po przeczytaniu drugiego pytania, myślę, że jedynym powodem, dla którego ktoś zalecił użycie stopera w produkcji, było to, że niesie ze sobą pewne obciążenie, ale wyobrażam sobie, że jest to dość małe i łatwe do zmierzenia. – RichieHindle

1

Można również użyć natywną strumieniowe MIDI API. Nie sądzę, że jest to w NAudio, ale możesz spojrzeć na C# Midi Toolkit, aby sprawdzić, czy ten obsługuje go. W przeciwnym razie masz dwa przykłady, jak wykonać natywne API MIDI P/Wywołać i możesz przetasować własne ...

+0

Istnieje kilka wrapperów do przesyłania strumieniowego interfejsów API MIDI w NAudio, ale nie zostały one jeszcze przetestowane. Mimo to może wskazać ci właściwy kierunek –

0

Windows multimedia timer stwierdza, że ​​umożliwia to "aplikacje do planowania zdarzeń zegara z największą rozdzielczością (lub dokładnością) możliwą dla sprzętu Platforma."

Aplikacja, której używa jako przykładu, to sekwenser MIDI.