关闭音频时线程很慢
Threads are slow when audio is off
我有两个项目。一个是用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资源的优先访问。
根据上面的文档,您还可以通过注册表项
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
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- 使用FFMPEG编写多线程视频和音频数据包
- 音频线程
- 什么是Qt中低延迟音频合成的最佳多线程方法
- 我什么时候需要一个无锁的数据结构来跨音频应用程序中的线程读取/写入数据
- 如何使一个线程在MFC中移动滑块控件相对于正在播放的音频文件
- 关闭音频时线程很慢