【发布时间】:2015-12-04 21:14:22
【问题描述】:
我有一个程序可以从系统时钟中读取当前时间并将其保存到文本文件中。我之前使用了有效的 GetSystemTime 函数,但时间并不完全一致,例如:一次是 32567.789,下一次是时间倒退的 32567.780。
我正在使用这个程序将时间节省多达每秒 10 次。我读到 GetSystemTimeAsFileTime 函数更准确。我的问题是,如何将当前代码转换为使用 GetSystemTimeAsFileTime 函数?我尝试使用 FileTimeToSystemTime 函数,但也有同样的问题。
SYSTEMTIME st;
GetSystemTime(&st);
WORD sec = (st.wHour*3600) + (st.wMinute*60) + st.wSecond; //convert to seconds in a day
lStr.Format( _T("%d %d.%d\n"),GetFrames() ,sec, st.wMilliseconds);
std::wfstream myfile;
myfile.open("time.txt", std::ios::out | std::ios::in | std::ios::app );
if (myfile.is_open())
{
myfile.write((LPCTSTR)lStr, lStr.GetLength());
myfile.close();
}
else {lStr.Format( _T("open file failed: %d"), WSAGetLastError());
}
编辑要添加更多信息,代码会从每秒运行 10 次的相机捕获图像,并将图像拍摄的时间保存到文本文件中。当我从第二个中减去文本文件的第一个条目时,依此类推,例如:条目 2-1 3-2 4-3 等我得到这个图,其中 x 轴是条目数,y 轴是减去的价值观。
所有这些都应该在大多数都在 0.12 左右。但是,您可以看到其中很多变化,有些甚至是负面的。这不是由于相机的原因,因为相机有自己的内部时钟并且没有变化。它与捕获系统时间有关。我想要的是以最高分辨率和尽可能少的噪声提取系统时间的最准确方法。
编辑 2 我已采纳您的建议并再次运行该程序。结果如下:
如您所见,它比以前好多了,但仍然不对。我觉得很奇怪,它似乎是非常渐进的。我也只是绘制了时间,这就是结果,其中 x 是条目,y 是时间:
有没有人知道是什么导致时间每 30 帧左右消失一次?
【问题讨论】:
-
您从哪里得知它们更准确?我希望它们是相同的(尽管
FILETIME版本可能会更快/更高效,因为它不必进行日/月/年计算)。 -
它只是不够精确,无法满足您的需求。在 Win8 及更高版本上使用 GetSystemTimePreciseAsFileTime(),在旧版本上使用 timeBeginPeriod(1)。
-
是的,我在 Windows 7 上,我将 timeBeginPeriod(1) 和 timeEndPeriod 放在代码块周围,它似乎没有任何区别
-
我添加了另一个编辑