随机应用程序在Windows XP(32位,SP3)播放声音时暂停半秒钟

时间:2012-12-03 08:44:53

标签: c++ windows-xp multicore

我注意到,当Windows(至少是我的)多核机器(不是虚拟机箱)播放声音时,不同程序的执行有时会延迟半秒。我测试了3种不同的计算机硬件配置我还写了一个小的c ++测试应用程序来重现这个问题。它只是在内存中计算出几兆字节的废话,并输出为此付出的时间。这是在循环中完成的,因此您可以不断获得输出。我上传了这个测试程序(包括自编译的源代码,例如Minco的GCC 4.7.2,如果你害怕可执行文件中的恶意软件)到这里:http://daiw.de/share/PrintCalculationTimes.zip

在以下屏幕截图中,您可以看到在执行程序时播放声音时(通过控制面板中的声音设置)会发生什么: http://daiw.de/share/PrintCalculationTimesWithoutSound.png

http://daiw.de/share/PrintCalculationTimesWithSoundWithAnnotations.png (每次单击播放按钮都不会发生这种情况,但只需多次点击就可以很容易地在我的测试PC上重现。)

这是一个众所周知的问题吗?有人可以用我提供的测试案例证实这一观察结果吗?

感谢您的关注。

DOBI

1 个答案:

答案 0 :(得分:3)

我看到的是16ms抖动,而不是半秒延迟。此外,我看到它独立于正在播放的任何声音(即使在您的屏幕截图中,这似乎也是如此)。

如果播放一些声音阻止(非背景优先)线程运行,那真的会让我感到惊讶。对于成千上万的电脑游戏来说,这将是一个严重的问题,所有这些游戏都需要流畅的动画和播放声音。

考虑到16ms是您在系统上使用的计时器的默认分辨率,结果并不奇怪。这正是你所期待的。

如果有的话,请尝试使用std::chrono::high_resolution_clock,或在程序开头添加timeBeginPeriod(1)(需要-lwinmm)。

(请注意timeBeginPeriod(1)使调度程序更频繁地执行全局,而不仅仅是在您的程序中,而不仅仅是程序的生命周期。如果您使用笔记本电脑并运行电池,您可能需要在测试后重新启动以节省电池。通常情况下,可以使用endTimePeriod(1)重置为正常,但是因为终止程序是终止程序无法正常工作的唯一方法。)