在本文中,我们将为您详细介绍在WindowsC++中logging具有毫秒精度和分辨率的时间戳的相关知识,此外,我们还会提供一些关于batch-file–用于在Windows7中更改屏幕分辨率的批处理
在本文中,我们将为您详细介绍在Windows C ++中logging具有毫秒精度和分辨率的时间戳的相关知识,此外,我们还会提供一些关于batch-file – 用于在Windows 7中更改屏幕分辨率的批处理文件、c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?、C系统时间到微秒精度的Windows?、Go on Windows中的高分辨率计时器(毫秒精度)的有用信息。
本文目录一览:- 在Windows C ++中logging具有毫秒精度和分辨率的时间戳
- batch-file – 用于在Windows 7中更改屏幕分辨率的批处理文件
- c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?
- C系统时间到微秒精度的Windows?
- Go on Windows中的高分辨率计时器(毫秒精度)
在Windows C ++中logging具有毫秒精度和分辨率的时间戳
我知道,对于时间精度,像timeGetTime,timeBeginPeriod,QueryPerformanceCounter等function是伟大的,同时提供良好的分辨率和准确性,但只基于自引导时间,没有直接链接到时钟的时间。
不过,我不想把事情时间这样的。 我希望能够生成一个确切的时间戳(本地时间),以便我可以将其显示在日志文件中,例如31-12-2010 12:38:35.345。 (我需要毫秒的准确度)
标准的Windows时间函数,如GetLocalTime,虽然它们提供了毫秒值,但不具有毫秒分辨率,具体取决于操作系统的运行情况。 我使用XP,所以我不能指望比15毫秒的分辨率更好。
我需要的是一种获得两全其美的方法,而不会产生大的开销来获得所需的输出。 过大的方法/计算将意味着logging器在其操作期间将开始耗尽太多的时间。
清除文件而不更改其时间戳
scapy:嗅探数据包缺乏浮点精度的时间戳
如何parsingsyslog时间戳
PHP:获取年份的最后一位数(例如:2015 == 5)
在Windows中的UDP SO_TIMESTAMP
什么是最好/最简单的方法来做到这一点?
查找是否有最近更改的文件,尽可能快
如何编码和解码64位格式的NTP时间戳?
C ++ / POSIX如何获得毫秒时间戳最有效的方法?
获取一个给定的月份和年份在PHP的开始和结束Unix的时间戳
修改文件创build/访问/写在Windows下的Python与时间戳
首先,一些功能:
// ========================================================================== #define NOMINMAX #define _AFXDLL #include "afxwin.h" // TRACE #include "windows.h" // ULARGE_INTEGER #include "mmSystem.h" // timeGetTime #pragma comment(lib,"Winmm.lib") // timeGetTime // ========================================================================== // convert FILETIME to ULONGLONG // (casting won''t work on 64-bit platforms,due to alignment of FILETIME members) inline void ToULL(const FILETIME& ft,ULONGLONG& uft) { ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime ; uli.HighPart= ft.dwHighDateTime; uft= uli.QuadPart; } // -------------------------------------------------------------------------- // convert ULONGLONG to FILETIME // (casting won''t work on 64-bit platforms,due to alignment of FILETIME members) inline void ToFILETIME(const ULONGLONG& uft,FILETIME& ft) { ULARGE_INTEGER uli; uli.QuadPart= uft; ft.dwLowDateTime = uli.LowPart ; ft.dwHighDateTime= uli.HighPart; } // -------------------------------------------------------------------------- // ULONGLONG version for GetSystemTimeAsFileTime inline void GetSystemTimeAsULL(ULONGLONG& uft) { FILETIME ft; ::GetSystemTimeAsFileTime(&ft); ToULL(ft,uft); } // -------------------------------------------------------------------------- // convert ULONGLONG to time-components bool ULLToSystemTime(const ULONGLONG nTime,// [i] WORD& nYear,// [o] 1601 - 30827 WORD& nMonth,// [o] 1 - 12 WORD& nDay,// [o] 1 - 31 WORD& nHour,// [o] 0 - 23 WORD& nMinute,// [o] 0 - 59 WORD& nSecond,// [o] 0 - 59 WORD& nMilliseconds ) // [o] 0 - 999 { SYstemTIME sysTime; FILETIME ft ; ToFILETIME(nTime,ft); // the wDayOfWeek member of the SYstemTIME structure is ignored if (0 == ::FileTimetoSystemTime(&ft,&sysTime)) return false; nYear = sysTime.wYear ; nMonth = sysTime.wMonth ; nDay = sysTime.wDay ; nHour = sysTime.wHour ; nMinute = sysTime.wMinute ; nSecond = sysTime.wSecond ; nMilliseconds= sysTime.wMilliseconds; return true; } // -------------------------------------------------------------------------- void TraceTime(const ULONGLONG nTime) // [i] { WORD nYear,nMonth,nDay,nHour,nMinute,nSecond,nMilliseconds; ULLToSystemTime(nTime,nYear,nMilliseconds); TRACE("Time: %02u-%02u-%04u %02u:%02u:%02u.%03un",nMilliseconds); }
现在,如何使用:
ULONGLONG u0,u1; ::GetSystemTimeAsULL(u0); // wait for tick (each 14.4mS) do { ::GetSystemTimeAsULL(u1); } while (u0==u1); DWORD d1= ::timeGetTime(); // d1 and u1 are Now synchronized // ... do some work // get current time: ULONGLONG u2= u1+(::timeGetTime() - d1)*10000; // mSec --> HectoNanoSec TraceTime(u2);
请注意,您应该在2-3分钟内重新同步d1和u1一次以保持准确性。 实际上,您可以测量时钟之间的漂移以找到最佳再同步间隔。
您可以尝试以100纳秒为单位表示时间的GetSystemAsFileTime 。 您需要使用Windows来确定它所填充的实际分辨率。
另一种方法是查询本地时间,并使用QueryPerformanceCounter在应用程序启动时锁定偏移量与时间的比率,并将其应用于随后的计数器读数。
我曾经为此写过代码,但最终放弃了它,并与操作系统的时间解决和平。 该代码同时调用了GetLocalTime和QueryPerformanceCounter 50次。 当我检测到GetLocalTime的结果被一个解决方案打勾改变,那么我认为相应的QueryPerformanceCounter的结果足够接近该刻度的开始。 这样我得到一个精确的时间偏移量。 从那时起,我打电话给QueryPerformanceCounter,并用时间偏移数学来计算当地时间。
最后我推断这一切都不值得这么麻烦,而且我也不需要那么精确。
我要做的是在启动时获取系统时间和queryperfcounter。 你知道有一个合理的准确的起点。
然后在你的日志系统中调用QueryPerformanceCounter(),减去开始的QPC值,再除以QPF得到秒(存储在一个double中),把这个值与启动时的系统时间结合起来打印。
typedef struct _TIME_FIELDS { USHORT Year; USHORT Month; USHORT Day; USHORT Hour; USHORT Minute; USHORT Second; USHORT Milliseconds; USHORT Weekday; } TIME_FIELDS; typedef signed __int64 INT64; typedef unsigned __int64 UINT64; INT64 get_current_time () { ULONG secs; LARGE_INTEGER tm; KeQuerySystemTime (&tm); RtlTimetoSecondsSince1970(&tm,&secs); /* NOTE: tm is in 100s of nano seconds */ return (secs * 1000 + (tm.QuadPart/10000)%1000); } LARGE_INTEGER get_system_time () { LARGE_INTEGER tm; INT64 time = get_current_time (); RtlSecondsSince1970ToTime (time,&tm); /* NOTE: tm is in 100s of nano seconds */ tm.QuadPart += (QTIME_MSECS(time)%1000)*10000; return tm; } int log_current_time () { static char* month_names[] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; LARGE_INTEGER tm,lcl_time; TIME_FIELDS fields; tm = get_system_time (); ExSystemTimetoLocalTime (&tm,&lcl_time); RtlTimetoTimeFields(&tm,&fields); printf ("%s %02d %04d:%02d:%02d:%02d:%02d",month_names[fields.Month - 1],fields.Day,fields.Year,fields.Hour,fields.Minute,fields.Second,fileds.Milliseconds); }
请注意,这段代码使用了两个没有记录的东西,TIME_FILEDS结构和RtlTimetoTimeFields函数。 我在我的代码中使用了一个类似的实现,它在所有当前的WIN NT风格上工作正常。 但是,使用这个不能保证在下一个WIN NT发行版中是可移植的
总结
以上是小编为你收集整理的在Windows C ++中logging具有毫秒精度和分辨率的时间戳全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
batch-file – 用于在Windows 7中更改屏幕分辨率的批处理文件
这样做的原因是我经常连接到高架投影仪,但我对其进行重新设置是错误的,我必须手动更改重新设置,然后在完成后将其更改回来.
我避免安装任何东西,所以如果可能的话,任何解决方案应该是一个自包含的文件(它是一台工作笔记本电脑!)
我认为它可能需要两个文件,第一个将分辨率更改为1024 x 768,另一个将其恢复为1280 x 1024.所有帮助表示赞赏.
干杯
DisplayChanger旨在通过命令行或批处理脚本调用,并在64位计算机上运行.它还可以生成专门用于多监视器(或投影仪)设置的可编辑配置文件 – 您可以手动设置显示器的方式,“创建”它的配置,然后随时调用该配置.
另一个流行的选择是开源的Qres utility,但注意只有32位且可配置性较差.
c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?
Stackoverflow上有一些问题/答案说明这一点并链接文档,但没有解释为什么会这样:
> Stackoverflow #1
> Stackoverflow #2
似乎有办法在Windows上实现微秒分辨率:
> GetSystemTimePreciseAsFileTime(Win8)
> QueryPerformanceCounter
我感兴趣的是为什么Boost以这种方式实现它,反过来又有可能解决方案更合适?
解决方法
QueryPerformanceCounter的功能再次取决于平台特定的细节(HPET,ACPI PM计时器,不变TSC等).有关详细信息,请参见MSDN: Acquiring high-resolution time stamps和SO: Is QueryPerformanceFrequency acurate when using HPET?.
各种版本的Windows都有特定的方案来更新系统时间. Windows XP具有固定的文件时间粒度,这与系统计时器分辨率无关.只有发布Windows XP版本才允许通过更改系统计时器分辨率来修改系统时间粒度.
这可以通过多媒体计时器API timeBeginPeriod和/或隐藏的API NtSetTimerResolution来实现(有关使用`的更多详细信息,请参阅this SO answer).
timeBeginPeriod和NtSetTimerResolution).
如上所述,GetSystemTimePreciseAsFileTime仅适用于桌面应用程序.原因是需要特定的硬件.
我感兴趣的是为什么Boost以这种方式实现它,反过来又有可能解决方案更合适?
采用上述事实将使实施非常复杂,结果非常具体.每个(!)Windows版本都经历了严重的时间更改.即使从8到8.1的最新小步骤也大大改变了计时程序.但是,在Windows上仍有进一步改善时间问题的空间.
我应该提一下,从Windows 8.1开始,GetSystemTimePreciseAsFileTime没有给出预期的结果或在MSDN: GetSystemTimePreciseAsFileTime function指定的结果.它将系统文件时间与QueryPerformanceCounter的结果相结合,以填补连续文件时间增量之间的差距,但它不需要系统时间调整考虑在内.有效的系统时间调整,例如,由SetSystemTimeAdjustment完成,修改系统时间粒度和系统时间的进度.但是,用于构建GetSystemTimePreciseAsFileTime结果的已使用性能计数器频率保持不变.结果,微秒部分被SetSystemTimeAdjustment设置的调整增益关闭.
C系统时间到微秒精度的Windows?
可能重复:
测量时间与分辨率在微秒的C + +?
嗨,
有一个简单的方法,我可以得到一个Windows机器上的系统时间,精度达到微秒?
Windows http.sys替代linux平台
用于java kiosk应用程序的windowsshell
os.makedirs在Python中uncpath失败
CreateFile是否可以返回NULL?
如何将叙述者焦点导航到Windows 10上的不可聚焦应用程序?
通过Windowsbatch file在另一个string之后追加一个string
Python检索Windows服务信息
Windows 8应用程序WebView捕获事件目标=“_ blank”
debugging督察显示奇怪的字符?
是否有可能访问另一个进程地址空间,以达到特定的对象实例?
看看GetSystemTimeAsFileTime
它可以在0.1微秒或100纳秒内给出准确度。
请注意,这是与POSIX Epoch不同的时代。
所以要在几微秒内获得POSIX时间,您需要:
FILETIME ft; GetSystemTimeAsFileTime(&ft); unsigned long long tt = ft.dwHighDateTime; tt <<=32; tt |= ft.dwLowDateTime; tt /=10; tt -= 11644473600000000ULL;
所以在这种情况下, time(0) == tt / 1000000
喜欢这个
unsigned __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); double timerFrequency = (1.0/freq); unsigned __int64 startTime; QueryPerformanceCounter((LARGE_INTEGER *)&startTime); //do something... unsigned __int64 endTime; QueryPerformanceCounter((LARGE_INTEGER *)&endTime); double timeDifferenceInMilliseconds = ((endTime-startTime) * timerFrequency);
我们真正需要的是一个高分辨率的GetTickCount() 。 据我所知,这并不存在。
如果你愿意使用一种骇人的方式来解决这个问题(这可能只适用于Windows的某些版本,比如XP),那么看看ReactOS 。 然后尝试下面的代码:
long long GetTickCount64() { return (long long) ((((unsigned long long)*(unsigned long int*)0x7FFE0000 * (unsigned long long)*(unsigned long int*)0x7FFE0004) * (unsigned long long)10000) >> 0x18); }
调整它可能会给你你需要在某些版本的Windows。
Go on Windows中的高分辨率计时器(毫秒精度)
以下代码演示了此问题.它设置5个定时器,第一个为1 ms,第二个为2 ms,……,最后一个为5 ms.计时器触发后,会打印其编号.在OSX和Linux上,这显然产生了“12345”作为输出,但在Windows上,数字或多或少随机(在Win 7和Windows Server 2012上测试).
package main import ( "fmt" "time" ) func main() { var timer1,timer2,timer3,timer4,timer5 *time.Timer timer1 = time.NewTimer(1 * time.Millisecond) timer2 = time.NewTimer(2 * time.Millisecond) timer3 = time.NewTimer(3 * time.Millisecond) timer4 = time.NewTimer(4 * time.Millisecond) timer5 = time.NewTimer(5 * time.Millisecond) // should print 12345 for { select { case <-timer1.C: fmt.Print("1") case <-timer2.C: fmt.Print("2") case <-timer3.C: fmt.Print("3") case <-timer4.C: fmt.Print("4") case <-timer5.C: fmt.Print("5") case <-time.After(200 * time.Millisecond): return // exit the program } } }
我认为这种行为是由于Go 1.6(https://golang.org/doc/go1.6#runtime,第4段)中所做的更改,其中Windows计时器精度从1毫秒减少到16毫秒,尽管它也应该以更短的间隔发生(大约100微秒)之前.
有没有办法将全局Windows计时器精度重置为1毫秒,或访问一个高分辨率计时器,使上面的例子工作?
解决方法
我们今天的关于在Windows C ++中logging具有毫秒精度和分辨率的时间戳的分享已经告一段落,感谢您的关注,如果您想了解更多关于batch-file – 用于在Windows 7中更改屏幕分辨率的批处理文件、c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?、C系统时间到微秒精度的Windows?、Go on Windows中的高分辨率计时器(毫秒精度)的相关信息,请在本站查询。
本文标签: