C++初学者如何使用GetSystemTimeAsFileTime

ood*_*123 0 c++ time winapi

我有一个程序从系统时钟读取当前时间并将其保存到文本文件.我之前使用过的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());
}           
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

在此输入图像描述

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

在此输入图像描述

有没有人知道什么可能导致每30帧左右出场的时间?

小智 5

首先,你想得到FILETIME如下

FILETIME fileTime;
GetSystemTimeAsFileTime(&fileTime);
// Or for higher precision, use
// GetSystemTimePreciseAsFileTime(&fileTime);
Run Code Online (Sandbox Code Playgroud)

FILETIME文件,

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

所以,接下来应该做的是

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

__int64 fileTime64Bit = theTime.QuadPart;
Run Code Online (Sandbox Code Playgroud)

就是这样.该fileTime64Bit变量现在包含你正在寻找的时间.

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

SYSTEMTIME systemTime;
FileTimeToSystemTime(&fileTime, &systemTime);
Run Code Online (Sandbox Code Playgroud)