关闭音频时线程很慢

Threads are slow when audio is off

本文关键字:线程 音频      更新时间:2023-10-16

我有两个项目。一个是用c++ Builder构建的,没有MFC风格。另一个是vc++ MFC 11。

当我创建一个线程并创建一个循环-让我们说这个循环添加一个进度条位置-从1到100使用Sleep(10),它当然适用于c++ Builder和c++ MFC。

现在,Sleep(10)等待10毫秒。好的。但问题是只有当我打开媒体播放器,Winamp或其他任何产生"声音"的东西。如果我关闭所有的媒体播放器,winamp和其他声音程序,我的线程速度会慢于10毫秒。

50-100 ms / each。如果我打开任何音乐,它会像我预期的那样正常工作。

我不知道为什么会发生这种事。我首先想到的是,我在MFC应用程序内犯了一个错误,但为什么c++生成器也变慢了?

是的,我肯定这与声音有关,因为我甚至重新格式化了我的窗口,禁用了所有东西。最后我发现了声音问题。

我的代码需要什么吗?

:

现在,我按照代码执行,发现在这些区域使用Sleep(1)等待1毫秒。这样做的原因是,我把一个物体从左移动到右。如果我移除这个睡眠,那么移动就不会显示出来,因为它非常快。所以我应该用Sleep(1)。使用Sleep(1),如果音频在上,则它可以工作。如果音频关闭,那么它将非常慢。

for (int i = 0; i <= 500; i++) {
   theDialog->staticText->SetWindowsPosition(NULL, i, 20, 0, 0);
   Sleep(1);
}

所以,关于这一点的建议真的很感激。我该怎么办?

我知道这是错误的方法。我应该用其他合适有效的东西。但究竟是什么呢?哪个函数或类可以帮助我平稳地将静态文本从一个位置移动到另一个位置?

同样,更改线程优先级也没有帮助。

更新2 :

更新1是另一个问题:)

Sleep(10)将(如我们所知)等待大约10毫秒。如果有更高优先级的线程需要在那一刻运行,线程唤醒可能会延迟。多媒体线程可能以实时或高优先级运行,因此当您播放声音时,您的线程唤醒会延迟。

请参阅Jeffrey Richters在《Programming Applications for Microsoft Windows(第4版)》第7章"Sleeping"一节中的评论:

系统使线程不可调度大约为指定的毫秒数。没错,如果你告诉系统你想睡100毫秒,你会睡大约100毫秒那么长,但可能还要多几秒或几分钟。记住,Windows不是一个实时操作系统。你的帖子可能会在正确的时间醒来,但是否正确取决于还有什么系统中正在发生的事情

也是根据MSDN多媒体类调度服务(Windows)

MMCSS 确保对时间敏感的处理接收到对CPU资源的优先访问。

根据上面的文档,您还可以通过注册表项

控制保证分配给低优先级任务的CPU资源百分比。

Sleep(10)等待至少 10毫秒。您必须编写代码来检查实际等待的时间,如果超过10毫秒,请在代码中理智地处理它。Windows不是实时操作系统

Sleep()定时的最小分辨率与timeBeginPeriod()timeEndPeriod()设置在系统范围内。例如,通过timeBeginPeriod(1)将最小分辨率设置为1ms。可能是音频程序将分辨率设置为1毫秒,并在完成后将其恢复为大于10毫秒的分辨率。我有一个使用Sleep(1)的程序的问题,只有在XE2 IDE运行时才能正常工作,但否则会睡眠12毫秒。我通过在程序开头直接设置timeBeginPeriod(1)解决了这个问题。

见:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx