У меня есть механизм кодирования, который воспроизводит длинные файлы WAV, последовательно воспроизводя меньшие фрагменты с помощью методов API waveOutOpen и waveOutWrite. Чтобы обновить мой пользовательский интерфейс во время воспроизведения файла, из функции обратного вызова, когда каждый буфер завершает воспроизведение, я вызываю отдельный поток (потому что вы хотите сделать как можно меньше внутри функции обратного вызова), который вызывает метод в моей форме.
Форма содержит уровень класса EventHandler
, который обрабатывает метод, в рамках которого я обновляю элементы интерфейса с новой информацией. В методе формы, вызываемом из функции обратного вызова waveOutWrite, я использую метод Invoke следующим образом:
if (_updatedisplay == null)
{
// UpdateDisplay contains code to set control properties on the form
_updatedisplay = new EventHandler(UpdateDisplay);
}
Invoke(_updatedisplay);
Все работает, но, похоже, время от времени происходит заметная задержка или задержка обновления элементов пользовательского интерфейса. Это легко увидеть, потому что я использую метод UpdateDisplay для управления анимацией, поэтому задержки выглядят как «икота», когда спрайт останавливается на долю секунды, прежде чем он переходит на ожидаемую позицию.
Возможно ли, что иногда при межпотоковом обмене данными возникает большая (может быть, 10-15 миллисекунд) задержка? Если так, то как лучше справиться с чем-то вроде этого?
Обновление : кстати, я определенно не уверен, что Invoke
является виновником здесь. Другой возможностью является задержка между моментом окончания воспроизведения фрагмента звука и фактическим вызовом функции обратного вызова.
Обновление 2 : согласно предложению itowlson
, я использовал System.Diagnostics.Stopwatch
для сравнения лага между Invoke
и вызовом метода. Из 1156 измерений я получил 1146 при 0 мс, 8 при 1 мс и 2 при 2 мс. Я думаю, можно с уверенностью сказать, что Invoke
здесь не мой виновник.