【发布时间】:2014-12-11 09:20:48
【问题描述】:
我在this post 中找到了有关使用 QueryPerformanceCounter 的有用信息,但我遇到了一个尚未找到答案的问题。
我正在为 Windows CE 6.0 开发一个应用程序,并且需要 GetTickCount 可以提供的更好的分辨率。这就是我选择 QueryPerformanceCounter 函数的原因。
我观察到我得到的计数器值来回移动。虽然它不是最终的应用程序,但这个小例子说明了这个问题:
int i;
BOOL bRet;
LARGE_INTEGER liCounter;
for ( i = 0; i < 100; i++)
{
bRet = QueryPerformanceCounter(&liCounter);
if(bRet)
{
printf("Counter Value: %llu \n", liCounter.QuadPart);
}
}
它打印一系列 100 个计数器值,这些值预计是递增的。但是,有一些计数器值相对于先前的值递减。例如:
...
计数器值:6536266821
计数器值:6536266262
计数器值:6536266604
...
这种行为是有问题的,因为在最终应用程序中执行 (endCounterValue-startCoutnerValue) 类型操作,并且在相同情况下发现负时间间隔。
我已阅读 (here) 在使用多核平台时会发现此问题。但是,情况并非如此,因为 Windows CE 6.0 不支持多核处理。
任何帮助找到发生这种情况的原因和/或任何避免此问题的解决方法将不胜感激。
[编辑]
我编辑问题以包含更多信息:
更长的连续读取列表(与上面的列表不同):
计数器值:15234261579
计数器值:15234261594
计数器值:15234261609
计数器值:15234261624
计数器值:15234261640
计数器值:15234261064
计数器值:15234261079
计数器值:15234261094
计数器值:15234261109
计数器值:15234261125
计数器值:15234261140
计数器值:15234261155
计数器值:15234261170
计数器值:15234261185
计数器值:15234261201
计数器值:15234261216
计数器值:15234261231
计数器值:15234261246
在硬件方面,使用的是 Intel Celeron 1047UE 处理器和 HM76 芯片组。
调用 QueryPerformanceFrequency 时,读取 1.19MHz 频率。
【问题讨论】:
-
如果结果小于前一个,则忽略该结果。另外:msdn.microsoft.com/en-us/library/windows/desktop/…
-
如果我忽略结果,我将丢失该间隔的时间数据。我必须防止这种情况发生。
-
闻起来像 BSP 错误。您可能需要就此联系您的设备/BSP 供应商。
标签: c++ timer embedded windows-ce performancecounter