Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以1ms的精度在窗口中查找时间的最快方法是什么?_C++_Windows_Winapi - Fatal编程技术网

C++ 以1ms的精度在窗口中查找时间的最快方法是什么?

C++ 以1ms的精度在窗口中查找时间的最快方法是什么?,c++,windows,winapi,C++,Windows,Winapi,对绝对时间感兴趣,而不是测量持续时间的方法 Win32 API c++性能计数器中有一种分辨率为1ms的IIRC。您需要特殊的硬件。尽管Windows API报告毫秒数,但根据以下讨论,它并不准确: 大多数英特尔奔腾基础PC(我不是 当然,其他人)有一个定时器芯片 在主板上有一个 1.19318166667MHz计数器 计数器从N开始倒计时(按 默认值N=65535)为1,比率为 1.19318166667MHz。当 计数器从1滚动到N(零 从未发生过)。请注意,系统时间为 由此中断更新 如果N

对绝对时间感兴趣,而不是测量持续时间的方法

Win32 API


c++

性能计数器中有一种分辨率为1ms的IIRC。

您需要特殊的硬件。尽管Windows API报告毫秒数,但根据以下讨论,它并不准确:

大多数英特尔奔腾基础PC(我不是 当然,其他人)有一个定时器芯片 在主板上有一个 1.19318166667MHz计数器

计数器从N开始倒计时(按 默认值N=65535)为1,比率为 1.19318166667MHz。当 计数器从1滚动到N(零 从未发生过)。请注意,系统时间为 由此中断更新

如果N=65535,则系统定时器 中断被生成 (1.19318166667/65535*1000000)=18.2 每秒10次。这相当于 每54.9毫秒

这种颗粒性在大多数情况下都是固有的 个人电脑今天正在使用


你需要硬件来达到这种绝对的精确度,比如。您还需要编写设备驱动程序级软件,用户模式程序的响应速度几乎无法达到毫秒。一般来说,Windows不是适合这种情况的操作系统。

如果您想要准确度,请查看。他们有软件可以让你从他们的服务器上获取时间。它具有较高的精度和分辨率。这也是GPS接收机使用的时间标准

但是,由于网络流量和不规则性,您可能无法以高频率获取时间。

是为用于媒体播放而设计的,因此它比
GetTickCount()
函数更精确。然而,它没有校准到时钟时间

使时钟时间精确到毫秒。您必须在尽可能接近相同的时间获取时钟时间,以及
timeGetTime
QueryPerformanceCounter
。然后,您可以连续调用
timeGetTime
等,以获取已知时钟时间经过的毫秒数


请注意,
timeGetTime
每47天循环一次…

您需要做的是将一天中的时间与偏移计数器的值相关联,并与计数器的频率一起,您随后可以在应用程序中快速计算绝对时间

对于不使用电源管理且具有稳定TSC的单核主机,使用速度最快,但您必须自己确定频率,通常通过运行固定时间循环(例如5秒)并测量差异来确定频率

该设备是为了克服TSC在多核、超线程和电源管理方面的缺陷而创建的,这些缺陷会导致时钟频率的变化。HPET仅在现代硬件中可用,它们有自己的计数器和可编程频率,并且必须与TSC类似读取。但成本更高,约为500纳秒


Windows提供了这些功能,要为您处理所有这些,它将自动选择APIC或HPET设备,并使用TSC插值。

NkyN需要挂钟时间。QPC没有给你这个,它的“精度”是1ms,我不相信它的“精度”是1ms。在紧密循环中调用它,当返回值更改时,查看它比以前的值大多少。-1即使SYSTEMTIME结构具有毫秒特性,但决不能精确到1毫秒。Windows如何知道精确到1毫秒的挂钟时间?互联网上的NTP不是很好,我很确定用户在“设置时间”对话框上单击“确定”也不是那么准确;-)windows不仅仅是用户程序我的经验是,在现代计算机上,准确度是16毫秒,而不是1毫秒。现代windows实际上每10毫秒启动一次计时器。很好的一点是SkyN和OldFart。事物在变化,“现代”是一个相对的术语。在18个月内,准确度将达到5毫秒。我现在很好奇,伙计们,.Net DateTime结构是细粒度的(1滴答=100纳秒=1毫秒内10000滴答)。我以前使用过滴答数来衡量绩效。如果电脑上最高分辨率计时器的分辨率约为10ms,那么以滴答为单位测量时间是否有任何值?(我现在说的不是时钟时间,而是持续时间测量)@JMarsch。高分辨率计数器使用不同的机制。原则上,这是一个可以直接从CPU读取的值,告诉您已通过的[小时间间隔]数,而不是每[大时间间隔]触发一次计时器中断并更新系统时间。在实践中,我不知道这到底是怎么做到的。为什么GetSystemTime不添加一个从高分辨率计数器计算的额外的细粒度项?我不知道,如果让我猜的话,我会说历史原因。