【发布时间】:2022-01-07 19:28:41
【问题描述】:
我正在通过 Windows.h 使用 Sleep 命令制作程序,并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异。我将我的程序简化为下面的程序,它表现出与我相同的行为更复杂的程序。
在 Windows 7 上,这个 5000 计数循环以 1 毫秒的时间运行睡眠功能。这需要 5 秒才能完成。
在 Windows 10 上,当我运行完全相同的程序(完全相同的二进制可执行文件)时,该程序几乎需要一分钟才能完成。
对于我的应用程序来说,这是完全不可接受的,因为我需要有 1ms 的时间延迟才能与我正在使用的硬件进行交互。
我还尝试了另一篇文章的建议以使用 select() 命令(通过 winsock2),但该命令也无法延迟 1 毫秒。我已经在多台 Windows 7 和 Windows 10 PC 上尝试过这个程序,问题的根本原因总是指向使用 Windows 10 而不是 Windows 7。该程序总是在大约 5 秒内在众多 Windows 7 PC 和多个 Windows 上运行我测试过的 10 台电脑的持续时间要长得多~60 秒。
我一直在使用 Microsoft Visual Studio Express 2010 (C/C++) 和 Microsoft Visual Studio Express 2017 (C/C++) 来编译程序。 Visual Studio 的版本不影响结果。
我还将编译选项从“调试”更改为“发布”,并尝试优化编译器,但这也无济于事。
任何建议将不胜感激。
#include <stdio.h>
#include <Windows.h>
#define LOOP_COUNT 5000
int main()
{
int i = 0;
for (i; i < LOOP_COUNT; i++){
Sleep(1);
}
return 0;
}
【问题讨论】:
-
Windows 不是实时操作系统,
Sleep()没有 1ms 的精度。对于这种精度,请使用高性能计数器(请参阅QueryPerformance(Counter|Frequency)函数),甚至只是一个自旋计数器。 -
运行发布可执行文件和调试可执行文件之间的运行时也会有显着差异。在我的系统上,它通常是 10 倍的差异。
-
@ZachariahRabatah:我想知道你是否读过the documentation,因为它明确表示“要提高睡眠间隔的准确性,请调用
timeGetDevCaps函数来确定支持的最小计时器分辨率和timeBeginPeriod函数将计时器分辨率设置为最小值。调用timeBeginPeriod时要小心,因为频繁调用会显着影响系统时钟、系统电源使用和调度程序..."
标签: c++ c windows windows-10 windows-7