我知道,对于计时准确性,timeGetTime,timeBeginPeriod,Query PerformanceCounter等功能都很棒,同时具有良好的分辨率和优点.准确性,但仅基于启动时间,没有与时钟时间的直接链接.

但是,我不想这样的时间事件.我希望能够生成一个确切的时间戳(本地时间),以便我可以在日志文件中显示它,例如31-12-2010 12:38:35.345,对于每个条目. (我需要毫秒精度)

标准的Windows时间函数,如GetLocalTime,虽然它们提供毫秒值,但没有毫秒级的分辨率,具体取决于运行的操作系统.我正在使用XP,所以我不能指望比大约15ms的分辨率好多了.

我需要的是一种获得两全其美的方法,而不会产生大量开销来获得所需的输出.过大的方法/计算意味着记录仪在其运行期间会开始耗费太多时间.

最好/最简单的方法是什么?

首先,一些功能:
// ==========================================================================
#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.%03u\n",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一次,以保持准确性.实际上,您可以测量时钟之间的漂移,以找到最佳的重新同步间隔.

使用Windows C中具有毫秒精度和分辨率的时间戳记录的更多相关文章

  1. iOS独立应用程序300毫秒单击延迟

    去年webkitremovedthe350msdelayforiOS.当我在Safari的移动浏览器中运行我的网站时,延迟不再存在,并按预期工作.但是,当我在standalonemode运行我的Web应用程序时,延迟存在,并且显而易见.这是我正在使用的元标记:我尝试了各种各样的变种,没有运气.很难找到关于独立应用程序的任何东西,不过这个明显的问题.有谁知道为什么这个350ms延迟点击只发生在独立模

  2. xcode – Swift计时器,以毫秒为单位

    我想每毫秒更改一次计时器,但它不能按预期工作.结果是计时器在毫秒部分(00:100)中更改为100,然后更改为01:00=40实际秒邓肯方法:结果:456680125.54539第一次打印解决方法正如Martin在评论中所说,定时器的分辨率为50-100毫秒(0.05到0.1秒).尝试运行时间间隔短于此的计时器将无法提供可靠的结果.此外,计时器不是实时的.它们取决于它们所连接的运行循环,如果运行循

  3. iOS:Google Analytics(分析)用户计时报告未在我的Google Analytics(分析)帐户中更新

    我正在尝试使用GoogleAnalytics(分析)跟踪我的应用速度,但是在GoogleAnalytics(分析)帐户中我看不到任何应用程序的速度.我已经跟踪了其他参数,如事件,崩溃和异常.对于这些参数,我可以看到我的Google分析帐户中生成的报告.以下是我用来发送事件时间的代码.以下是控制台中打印的消息.GoogleAnalytics2.0b4-[GAIdispatcherdispatchCo

  4. Swift 获取当前时间戳 (秒级,毫秒级)

    Swift获取当前时间戳经常见到有人将秒级时间戳以Int类型直接*1000来获取毫秒,这样的结果最后的3位数字都是0,获取到的结果不够精确。创建一个Date的Extension,代码如下使用

  5. Android:将日期转换为毫秒

    我用了得到时间,现在我想将这个时间转换为毫秒,因为我有一个带有几个日期和文本的文件,我想以毫秒转换日期,以便我不能添加收件箱中的文字使用因为我必须花费时间以毫秒为单位,我必须转换时间,有谁知道如何?解决方法最简单的方法是将Date类型转换为毫秒:

  6. android – Mapview getLatitudeSpan和getLongitudeSpan无效

    有时,当尝试使用getLatitudeSpan()和getLongitudeSpan()获取mapview的纬度范围或经度范围时,我分别获得0和360*1E6.这不会永远发生,但这是一个问题,有人有这个问题吗?

  7. php生成毫秒时间戳的实例讲解

    下面小编就为大家带来一篇php生成毫秒时间戳的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. PHP实现获取毫秒时间戳的方法【使用microtime()函数】

    这篇文章主要介绍了PHP实现获取毫秒时间戳的方法,结合实例形式分析了php使用microtime()函数获取、转换毫秒级时间戳的相关操作技巧,需要的朋友可以参考下

  9. iOS实现毫秒倒计时的方法详解

    倒计时在我们日常开发中必不可少,最近在公司的一个项目中就遇到了这个需求,本文着重介绍的是利用iOS实现毫秒倒计时的方法,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起学习学习吧。

  10. 使用Windows C中具有毫秒精度和分辨率的时间戳记录

    首先,一些功能:现在,如何使用:请注意,您应该在2-3分钟内重新同步d1和u1一次,以保持准确性.实际上,您可以测量时钟之间的漂移,以找到最佳的重新同步间隔.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部