C ++初学者如何使用GetSystemTimeAsFileTime

时间:2015-09-09 03:27:59

标签: c++ winapi time

我有一个程序从系统时钟读取当前时间并将其保存到文本文件中。我之前使用的GetSystemTime函数有效,但时间并不完全一致,例如:其中一个时间是32567.789,下一个时间是32567.780,这是时间倒退。

我正在使用此程序将时间节省高达每秒10次。我读到GetSystemTimeAsFileTime函数更准确。我的问题是,如何将当前代码转换为使用GetSystemTimeAsFileTime函数?我试图使用FileTimeToSystemTime函数,但有同样的问题。

class Marker(dict):

  def __init__(self, username, email=None):
      self.username = username
      if email:
         self.email = email
  @property
  def username(self):
      return self.get('username')
  @username.setter
  def username(self, val):
      self['username'] = val
  def save(self):
      db.collection.save(self)

编辑要添加更多信息,代码会从每秒运行10次的相机中捕获图像,并将图像拍摄的时间保存到文本文件中。当我从第二个中减去文本文件的第一个条目,依此类推,例如:条目2-1 3-2 4-3等我得到这个图,其中x轴是条目数,y轴是减去的值。

enter image description here

所有这些都应该在大约0.12的标记附近。但是你可以看到它们中的很多都有所不同,有些甚至是负面的。这不是因为相机,因为相机有自己的内部时钟,没有变化。它与捕获系统时间有关。我想要的是以最高分辨率和尽可能少的噪声提取系统时间的最准确方法。

编辑2 我已接受您的建议并再次运行该程序。这是结果:

enter image description here

正如你所看到的,它比以前好很多但它仍然不对。我觉得奇怪的是它似乎非常增量。我也只绘制了时间,这是结果,其中x是条目,y是时间:

enter image description here

有没有人知道每30帧左右会出现什么时间?

2 个答案:

答案 0 :(得分:5)

首先,您想获得FILETIME如下

FILETIME fileTime;
GetSystemTimeAsFileTime(&fileTime);
// Or for higher precision, use
// GetSystemTimePreciseAsFileTime(&fileTime);

根据FILETIME的{​​{3}},

  

建议您不要在FILETIME结构中添加和减去值以获取相对时间。相反,您应该将文件时间的低位和高位部分复制到ULARGE_INTEGER结构,对QuadPart成员执行64位算术运算,并将LowPart和HighPart成员复制到FILETIME结构中。

那么,接下来应该做的是

ULARGE_INTEGER theTime;
theTime.LowPart = fileTime.dwLowDateTime;
theTime.HighPart = fileTime.dwHighDateTime;

__int64 fileTime64Bit = theTime.QuadPart;

就是这样。 fileTime64Bit变量现在包含您要查找的时间。

如果您想获得SYSTEMTIME对象,则可以执行以下操作:

SYSTEMTIME systemTime;
FileTimeToSystemTime(&fileTime, &systemTime);

答案 1 :(得分:0)

我相信你正在寻找GetSystemTimePreciseAsFileTime()函数甚至QueryPerformanceCounter() - 是保证产生单调值的东西的缩写。