2009-04-27 9 views
9

Я только что видел this question, где один из ответов указывает, что System.Diagnostics.Stopwatch должен использоваться только для диагностики производительности, а не для производственного кода.Точность синхронизации в .NET

В этом случае, какой был бы лучший способ получить точное время в .NET? В настоящее время я нахожусь на ранней стадии построения очень простого секвенсора MIDI, используя функциональность MIDI-out от NAudio. Я хотел бы иметь возможность отправлять MIDI-сообщения в соответствии с (скажем) 1/10 с минимальным дрожанием. Возможно ли это, или такие вещи, как переключение контекста, разрушают мой день?

В настоящее время у меня есть код в консольном приложении, который непрерывно вызывает Stopwatch и вычисляет дрожание при генерации потока 1/16-й ноты со скоростью 150bpm. В этой ситуации джиттер очень низок. Однако я переведу это в другой поток, поэтому я не знаю, сохранится ли это.

ответ

6

Если вы не возражаете P/Invoke, вы можете использовать QueryPerformanceCounter: http://www.eggheadcafe.com/articles/20021111.asp

+0

+1. Счетчики производительности дают вам самый точный, легкий счетчик, который вы можете найти. Это не так просто, как другие реализации. –

+7

Насколько я понимаю, секундомер использует QueryPerformanceCounter, если он доступен. Я не имею ничего против QPC и использовал его в приложениях C++/Win32 раньше, однако я не знаю, что происходит на нижних уровнях CLR, поэтому было интересно, есть ли лучший способ. – geofftnz

+0

Вы правы, Секундомер действительно использует QueryPerformanceCounter - я не понял. Прочитав другой вопрос, я думаю, что единственная причина, по которой кто-то рекомендовал использовать секундомер в производстве, состоял в том, что он несет некоторые накладные расходы, но я думаю, что это довольно мало и легко измеряется. – RichieHindle

1

Вы также можете использовать нативный потоковое MIDI API. Я не думаю, что это в NAudio, но вы можете посмотреть на C# Midi Toolkit, чтобы узнать, поддерживает ли это его. В противном случае у вас есть два примера того, как сделать собственный MIDI API P/Invoke и вы можете катить свой собственный ...

+0

есть несколько оберток для потоковых MIDI-интерфейсов в NAudio, но они еще не прошли их шагов. Тем не менее, может указать вам в правильном направлении –

0

Windows multimedia timer заявляет, что он позволяет «приложениям планировать события таймера с наибольшим разрешением (или точностью), возможным для аппаратного обеспечения Платформа."

Приложение, которое оно использует в качестве примера, представляет собой MIDI-секвенсор.