Какой длины задержка между Управлением. Вызвать () и вызов его Делегата?

У меня есть механизм кода, который играет длинные файлы WAV путем проигрывания меньших блоков по очереди с помощью waveOutOpen и методов waveOutWrite API. Для обновления моего UI, поскольку файл играет от функции обратного вызова, поскольку каждый буфер завершает проигрывание, я Вызываю отдельный поток (потому что Вы хотите сделать как можно меньше в функции обратного вызова), который называет метод в моей форме.

Форма содержит уровень класса EventHandler это обрабатывает метод, в рамках которого я обновляю элементы UI с новой информацией. В методе формы, названном от waveOutWrite функции обратного вызова, я использую Вызвать метод как так:

if (_updatedisplay == null)
{
    // UpdateDisplay contains code to set control properties on the form
    _updatedisplay = new EventHandler(UpdateDisplay);
}
Invoke(_updatedisplay);

Работы Everythings, но кажется, что время от времени существует значимая задержка или задержка обновления элементов UI. Это легко видеть, потому что я использую метод UpdateDisplay для управления анимацией, таким образом, задержки появляются как "отклонения", где спрайт, кажется, замораживается в течение доли секунды, прежде чем это перейдет к своей ожидаемой позиции.

Действительно ли возможно, что иногда существует длинное (возможно, 10-15 миллисекунд) задержка, вовлеченная в коммуникацию перекрестного потока как это? Если так, что такое лучший способ обработать что-то вроде этого?

Обновление: между прочим, я определенно не уверен это Invoke преступник здесь. Другая возможность является задержкой между тем, когда блок аудио проигрывания концов и когда функцию обратного вызова на самом деле называют.

Обновление 2: на itowlsonпредложение, я использовал a System.Diagnostics.Stopwatch сравнивать задержки между Invoke и вызов метода. Из измерений 1156 года я получил 1146 в 0ms, 8 на уровне 1 мс, и 2 на уровне 2 мс. Я думаю, смело можно сказать, Invoke не мой преступник здесь.

6
задан MusiGenesis 20 February 2010 в 23:18
поделиться

1 ответ

Да, задержка может быть произвольно большой. Invoke работает, посылая сообщение Windows целевому элементу управления, поэтому оно будет обработано только тогда, когда целевой поток перекачает сообщения. Если поток уже обрабатывает сообщение, и эта обработка занимает время, то может возникнуть ощутимая задержка, прежде чем поток передаст следующее сообщение и тем самым обработает Invoke.

Лучшим способом может быть вызов BeginInvoke. Это не избавит вас от потенциальной задержки обработки сообщения потоком пользовательского интерфейса, но избавит вызывающий поток от блокировки в ожидании, пока поток пользовательского интерфейса передаст сообщение. Однако это может не помочь в вашем сценарии, где похоже, что именно загруженность потока UI вызывает глюки в анимации.

Обновление в ответ на ваше обновление: Обратите внимание, я говорю лишь о том, что может быть произвольно долгая задержка, а не о том, что будет заметная задержка или что это определенно причина вашей задержки. 10-15 мс кажутся необычно долгим временем для приложения, которое оно тратит на обработку сообщений, если только в потоке пользовательского интерфейса не происходит что-то действительно интенсивное, так что вам, конечно, стоит рассмотреть альтернативные причины!

3
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: