6

我有2个项目。一种是由没有 MFC 风格的 C++ Builder 构建的。另一个是 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 是另一个问题:)

4

3 回答 3

4

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

于 2012-12-27T07:22:08.793 回答
4

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

请参阅 Microsoft Windows 编程应用程序(第 4 版)中的 Jeffrey Richters 评论,第 7 章中的睡眠部分:

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

同样根据 MSDN多媒体类调度服务 (Windows)

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

根据上述文档,您还可以通过注册表项控制保证低优先级任务的 CPU 资源百分比

于 2012-12-27T08:19:48.570 回答
2

The minimum resolution for Sleep() timing is set system wide with timeBeginPeriod() and timeEndPeriod(). For example passing timeBeginPeriod(1) sets the minimum resolution to 1 ms. It may be that the audio programs are setting the resolution to 1 ms, and restoring it to something greater than 10 ms when they are done. I had a problem with a program that used Sleep(1) that only worked fine when the XE2 IDE was running but would otherwise sleep for 12 ms. I solved the problem by directly setting timeBeginPeriod(1) at the beginning of my program.

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

于 2013-02-19T15:42:27.040 回答