【发布时间】:2010-02-20 21:47:54
【问题描述】:
我有一个代码引擎,它通过使用 waveOutOpen 和 waveOutWrite API 方法连续播放较小的块来播放长 WAV 文件。为了在文件播放时更新我的 UI,在每个缓冲区完成播放时从回调函数中调用一个单独的线程(因为您希望在回调函数中尽可能少地执行此操作),该线程在我的表单中调用一个方法。
表单包含一个类级别EventHandler,它处理一个方法,在该方法中我使用新信息更新 UI 元素。在从 waveOutWrite 回调函数调用的表单方法中,我使用 Invoke 方法如下:
if (_updatedisplay == null)
{
// UpdateDisplay contains code to set control properties on the form
_updatedisplay = new EventHandler(UpdateDisplay);
}
Invoke(_updatedisplay);
一切正常,但 UI 元素的更新有时会出现明显的滞后或延迟。这很容易看出,因为我使用 UpdateDisplay 方法来驱动动画,因此延迟显示为“打嗝”,精灵在跳到预期位置之前似乎冻结了一瞬间。
这样的跨线程通信是否可能有时会出现很长的延迟(可能是 10-15 毫秒)?如果是这样,有什么更好的方法来处理这样的事情?
更新:顺便说一句,我绝对不确定Invoke 是这里的罪魁祸首。另一种可能性是一段音频播放完毕和回调函数实际被调用之间的延迟。
更新 2:根据itowlson 的建议,我使用System.Diagnostics.Stopwatch 来对Invoke 和方法调用之间的延迟进行基准测试。在 1156 次测量中,我在 0 毫秒时得到 1146 次,在 1 毫秒时得到 8 次,在 2 毫秒时得到 2 次。我认为可以肯定地说Invoke 不是我的罪魁祸首。
【问题讨论】:
标签: c# .net multithreading waveoutwrite