2

第一次在这里海报。

我正在 Windows XP SP2 上用 C++ (MSVC) 编写一个多线程流音频应用程序。

我遇到的问题是,在最小化/恢复任务栏上的任何应用程序时,我的应用程序中的所有线程都在窗口动画处于活动状态时被挂起。这会影响我,因为每次最小化或恢复窗口时,它都会导致我的应用程序中的音频出现断断续续的情况。

在窗口/系统属性/高级/性能“视觉效果,处理器调度,...”/设置/自定义选项卡中取消选中标题为“最小化最大化时动画窗口”的复选框似乎可以解决此问题。

将我的进程的优先级调整为“高”和“实时”没有帮助。

任何人都可以帮助阐明这个话题吗?

4

1 回答 1

3

这些动画,或在拖动窗口时绘制窗口(这应该会产生类似的问题)用 WM_PAINT 消息淹没窗口消息提示,并导致窗口中的每个小部件/控件重新绘制自身。这会使计算机及其上运行的所有线程和进程完全陷入瘫痪。

两种可能的解决方案:

  • 冻结窗口,即在调整窗口大小/最小化/被拖动时丢弃任何 WM_PAINT 消息。您也可以通过使用某种标志 (lockRedraw) 或类似的方式来做到这一点。

    • 更改优先级对您没有帮助,甚至可能会增加问题,尽管我对 wxp 的调度策略一无所知。

编辑:忘记了实际的第二个解决方案:

  • 为您的音频使用更大的缓冲区。如果您可以一口气将半秒或整秒的缓冲区传递给声卡,那么在多线程环境中您绝对应该是安全的

重新编辑:我忽略了你说的任何窗口。只有使用更大缓冲区的解决方案 2 可能会有所帮助。声音缓冲区通常会被扔到硬件上的某个缓冲区中,一旦它们在那里,应该没问题。

我想到了另一种可能性:这些动画带有声音。检查您为最大化/最小化设置了哪种声音。将其关闭并重试

如果问题仍然存在,则可能是由于显卡驱动程序不佳。如果没有,请查看您的声音(可能是 directSound?不知道)设置是否正常。也许您可以编写一些资源冲突。(不在硬件管理器中,而是在您访问声音设备的方式中。)

于 2009-04-15T16:50:52.470 回答