我有2个项目。一个是由C ++ Builder构建的,没有MFC Style。另一个是VC ++ MFC 11。
当我创建一个线程并创建一个循环时 - 假设这个循环将一个添加到进度条位置 - 从1到100使用Sleep(10)
它当然适用于C ++ Builder和C ++ MFC。
现在,Sleep(10)
等待10毫秒。好。但问题是,只有我有开放媒体播放器,Winamp或任何其他产生“声音”的东西。如果我关闭所有媒体播放器,winamp和其他声音程序,我的线程会慢于10毫秒。
需要50-100 ms / each
。如果我打开任何音乐,它会像我预期的那样正常工作。
我不知道为什么会这样。我首先想到我在MFC App中犯了一个错误,但为什么C ++ Builder也会慢下来?
是的,我确信它与声音有关,因为我甚至重新构建了我的窗户,禁用了一切。最后我发现了声音问题。
我的代码需要什么吗?
更新:
现在,我按照代码发现我在这些区域使用 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是另一个问题:)
答案 0 :(得分:4)
Sleep(10)
等待至少 10毫秒。您必须编写代码来检查实际等待的时间长度,如果超过10毫秒,请在代码中妥善处理。 Windows不是实时操作系统。
答案 1 :(得分:4)
睡眠(10),将(如我们所知),等待大约10毫秒。如果当时需要运行更高优先级的线程,则线程唤醒可能会延迟。多媒体线程可能以实时或高优先级运行,因此当您播放声音时,线程唤醒会被延迟。
请参阅Jeffrey Richters在Microsoft Windows编程应用程序(第4版)中的评论,第7章中的睡眠部分:
系统使得线程不能大约调度 指定的毫秒数。那是对的 - 如果你告诉系统的话 你想睡100毫秒,你会睡大概 那么长但可能是几秒或几分钟。记住这一点 Windows不是实时操作系统。你的线程可能会 在正确的时间醒来,但它是否确实取决于其他什么 继续在系统中。
同样根据MSDN Multimedia Class Scheduler Service (Windows)
MMCSS 确保时间敏感的处理接收对CPU资源的优先访问权。
根据上述文档,您还可以通过注册表项控制将保证低优先级任务的CPU资源百分比
答案 2 :(得分:2)
Sleep()
时间的最低分辨率在系统范围内设置为timeBeginPeriod()
和timeEndPeriod()
。例如,传递timeBeginPeriod(1)
将最小分辨率设置为1 ms。可能是音频程序将分辨率设置为1 ms,并在完成后将其恢复为大于10 ms的值。我遇到了一个使用Sleep(1)
的程序的问题,该程序在XE2 IDE运行时才能正常工作,否则将睡眠12毫秒。我通过在程序开头直接设置timeBeginPeriod(1)
来解决问题。
请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx