我有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);
}
Run Code Online (Sandbox Code Playgroud)
因此,对此的建议非常感谢.我该怎么办?
我知道这是不正确的方式.我应该使用其他正确有效的东西.但到底是什么?哪个函数或类可以帮助我顺利地将静态文本从一个位置移动到另一个位置?
此外,更改线程优先级没有帮助.
更新2:
更新1是另一个问题:)
Sleep (10) 将(据我们所知)等待大约 10 毫秒。如果此时有更高优先级的线程需要运行,则线程唤醒可能会延迟。多媒体线程可能以实时或高优先级运行,因此当您播放声音时,线程唤醒会延迟。
\n\n请参阅《Microsoft Windows 的编程应用程序》(第 4 版)中的 Jeffrey Richters 评论,第 7 章中的“睡眠”部分:
\n\n\n\n\n系统使线程在大约指定的毫秒数内无法调度。\n 是的\xe2\x80\x94如果你告诉系统\n你想睡眠100毫秒,你就会睡大约\n那么长的时间,但可能会多睡几秒或几分钟。请记住,Windows 不是实时操作系统。您的线程可能会在正确的时间唤醒,但是否唤醒取决于系统中正在发生的其他情况。
\n
另根据 MSDN多媒体类调度程序服务 (Windows)
\n\nMMCSS确保时间敏感的处理能够优先访问 CPU 资源。
\n\n根据上述文档,您还可以通过注册表项控制保证低优先级任务的 CPU 资源百分比
\n