hackxq 2023-01-12 19:42 采纳率: 0%
浏览 59
已结题

GetTickCount未到49天提前归0翻转

问题遇到的现象和发生背景

程序运行环境:windows server 2012操作系统。
程序开发环境:C++、MFC、VS2010

通过日志发现,GetTickCount函数返回值,在没有达到49天左右时,提前(31天左右)发生了归0翻转。

遇到的现象

从日志记录中发现:
当返回值为2684354091时,

1秒内再次记录时,该值为0。

3秒后,该值为3296,并持续累积。

相关代码

日志记录部分的代码:

DWORD dwTick = GetTickCount();
CString strTick;
strTick.Format(" %u ", dwTick);
// 记录到日志文件
Log2File(strTick)

程序中依赖该时间戳的逻辑同样因提前翻转出现了问题。
时间点和现象与日志记录的翻转时间相符。

运行结果及详细报错内容
我的解答思路

反复检查过代码,
没有任何地方显性或隐性的将返回值转换成WORD、SHORT或int,都使用了DWORD类型。
怀疑:
windows server 2012操作系统是否有相关的事件能够触发GetTickCount返回值归0,比如休眠等?但用户程序始终是不间断的运行,所以不可能是操作系统重启

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

请问去除操作系统重启的情况下,是什么原因导致GetTickCount返回值在未到达49天时,提前发生归0翻转

  • 写回答

4条回答 默认 最新

  • TGpenguin 2023-01-12 20:05
    关注

    您可以使用 QueryPerformanceCounter 函数来替代 GetTickCount 函数,它返回的是高精度的时间戳。或者使用 timeGetTime() 函数返回类似的值。

    另外,还可以考虑使用 std::chrono::high_resolution_clock 来获取高精度时间戳。

    使用 QueryPerformanceCounter 函数来替代 GetTickCount 函数:

    LARGE_INTEGER liTick;
    QueryPerformanceCounter(&liTick);
    CString strTick;
    strTick.Format(" %llu ", liTick.QuadPart);
    // 记录到日志文件
    Log2File(strTick);
    

    使用 std::chrono::high_resolution_clock 来获取高精度时间戳:

    auto time_now = std::chrono::high_resolution_clock::now();
    auto duration = time_now.time_since_epoch();
    unsigned long long int timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
    CString strTick;
    strTick.Format(" %llu ", timestamp);
    // 记录到日志文件
    Log2File(strTick);
    
     使用 std::chrono::high_resolution_clock 需要加上<chrono>头文件 
    

    望采纳

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月20日
  • 创建了问题 1月12日