代码之家  ›  专栏  ›  技术社区  ›  SPlatten

MSVC 2008更好的时机?

  •  0
  • SPlatten  · 技术社区  · 8 年前

    我目前正在从事的项目使用MSVC 2008,在这方面我没有任何选择。

    正在使用此功能的操作系统最新版本为Windows 10。我正在尝试在应用程序中引入更精确的计时,但到目前为止,我在网上进行的大多数搜索都导致了一个死胡同,是的,新版MSVC确实支持更精确的计时,但我没有这些。

    是否有任何方法可以提高计时的分辨率,不仅是分辨率,而且精度。

    我曾在QNX等其他操作系统上使用和工作过,在QNX中,很可能使用纳秒精度的计时器,而这是在旧得多的硬件上进行的。

    福吉:现在我正在考虑将两个例程的结果结合起来,调用:

        GetLocalTime
    

    要返回大量数据,请使用年、月、日、时、分和秒,然后使用:

        QueryPerformanceFrequency
        QueryPerformanceCounter
    

    为了获得并计算微秒部分,并掩盖大于一秒的任何内容,所以我将小数部分保留为微秒。

    1 回复  |  直到 8 年前
        1
  •  0
  •   SPlatten    8 年前

    这是我测试过的解决方案,结果很好:

        LARGE_INTEGER liFreq, liNow;
        SYSTEMTIME sstNow;       
        char szMsg[768];
        long lngMicro;
        /*Get high performance frequency and counter*/
        QueryPerformanceFrequency(&liFreq);
        QueryPerformanceCounter(&liNow);
        /*Work out elapsed microseconds using frequency*/
        liNow.QuadPart *= 1000000;
        liNow.QuadPart /= liFreq.QuadPart;
        /*Mask out everything >= 1 second */
        lngMicro = liNow.QuadPart % 1000000;
        /*Get the system date and time*/
        GetLocalTime(&sstNow);
        /*Build up formatted debug string including sequence number, line number
         *date and time stamp including microseconds and message detail*/
        sprintf_s(szMsg, sizeof(szMsg)
             ,"%4d-%02d-%02d %02d:%02d:%02d.%06ld DBG:%-24sL%05uSQ%05uET%16.6f%s%s\n"            
             ,sstNow.wYear, sstNow.wMonth, sstNow.wDay
             ,sstNow.wHour, sstNow.wMinute, sstNow.wSecond
             ,lngMicro, cpszClipped, uintLineNo
             ,suintDbgSeqNo, dblElapsed, sszIndents, cpszFormat);
    

    这并不是全部功能,但希望能为任何人提供足够的信息,让他们了解发生了什么以及它是如何工作的,下面是使用此技术生成的日志文件的一个片段:

        2018-05-16 08:17:52.334189 DBG:FsLonSource.cpp         L01079SQ00011ET        5.334189   CFsLonSource::SubmitCommand(AddressType:Local NI, Mode:0, Selector:0)
        2018-05-16 08:17:52.334449 DBG:NodetalkLONInterface.c  L01862SQ00012ET        5.334449     AdapterSetAddress(DomainId:, SubnetId:1, NodeId:1)
        2018-05-16 08:17:52.334807 DBG:NodetalkLONInterface.c  L01522SQ00013ET        5.334807       AdapterSetAddressInternal(DomainId:, SubnetId:1, NodeId:1)
        2018-05-16 08:17:52.335413 DBG:NodetalkLONInterface.c  L01021SQ00014ET        5.335413         NodeSetAddress(ServiceType: ACKD): ok
        2018-05-16 08:17:52.335603 DBG:NodetalkLONInterface.c  L01055SQ00015ET        5.335603         NodeSetModeState()
        2018-05-16 08:17:52.335783 DBG:NodetalkLONInterface.c  L01064SQ00016ET        5.335783           ServiceType: UNACKD
        2018-05-16 08:17:52.335966 DBG:NodetalkLONInterface.c  L01065SQ00017ET        5.335966           NewMode: ?
        2018-05-16 08:17:52.336124 DBG:NodetalkLONInterface.c  L01071SQ00018ET        5.336124           NewState: Configured, Online
        2018-05-16 08:17:52.339081 DBG:FsLonDispatch.cpp       L00342SQ00019ET        5.339081           CFsLonDispatch::ExecRequest(): S_OK
        2018-05-16 08:17:52.433098 DBG:FsLonDispatch.cpp       L00181SQ00020ET        5.433098         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
        2018-05-16 08:17:52.436138 DBG:FsLonDispatch.cpp       L00250SQ00021ET        5.436138           strCCommand: UpdateRest
        2018-05-16 08:17:52.436431 DBG:FsLonDispatch.cpp       L00342SQ00022ET        5.436431           CFsLonDispatch::ExecRequest(): S_OK
        2018-05-16 08:17:52.437184 DBG:FsLonDispatch.cpp       L00181SQ00023ET        5.437184         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
        2018-05-16 08:17:52.439981 DBG:FsLonDispatch.cpp       L00250SQ00024ET        5.439981           strCCommand: UpdateRest
        2018-05-16 08:17:52.440331 DBG:FsLonDispatch.cpp       L00342SQ00025ET        5.440331           CFsLonDispatch::ExecRequest(): S_OK
        2018-05-16 08:17:52.440705 DBG:FsLonDispatch.cpp       L00181SQ00026ET        5.440705         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
        2018-05-16 08:17:52.443586 DBG:FsLonDispatch.cpp       L00250SQ00027ET        5.443586           strCCommand: UpdateRest
        2018-05-16 08:17:52.443792 DBG:FsLonDispatch.cpp       L00342SQ00028ET        5.443792           CFsLonDispatch::ExecRequest(): S_OK
        2018-05-16 08:17:52.951870 DBG:NodetalkLONInterface.c  L01108SQ00029ET        5.951870         ServiceType: REQUEST
        2018-05-16 08:17:52.955944 DBG:NodetalkLONInterface.c  L01152SQ00030ET        5.955944         NodeSetModeState(): ok
        2018-05-16 08:17:52.956289 DBG:NodetalkLONInterface.c  L01555SQ00031ET        5.956289       AdapterSetAddressInternal(): ok
        2018-05-16 08:17:52.956655 DBG:NodetalkLONInterface.c  L01597SQ00032ET        5.956655     AdapterSetRcvTimer(ServiceType: REQUEST, AddressType: LOCAL)
        2018-05-16 08:17:52.966897 DBG:NodetalkLONInterface.c  L01625SQ00033ET        5.966897       AdapterSetRcvTimer(): ok
        2018-05-16 08:17:52.967216 DBG:NodetalkLONInterface.c  L01878SQ00034ET        5.967216     AdapterSetAddress(): ok
        2018-05-16 08:17:52.967531 DBG:FsLonSource.cpp         L01174SQ00035ET        5.967531   CFsLonSource::SubmitCommand(): ok