为什么与两者相比,我得到的毫秒值不同(QTIme和QueryPerformanceCounter)

why am getting different milliseconds value in compared to both (QTIme & QueryPerformanceCounter)

本文关键字:QTIme QueryPerformanceCounter 为什么      更新时间:2023-10-16

my .h 文件

#ifndef ITime_H
#define ITime_H
#include <QDebug> 
#include <iostream>
#include <QtCore>
#include <windows.h>

class ITime 
{
public:
    ITime();
    ~ITime();
    void start();
    quint64 milli();
    quint64 elapsed();

public:
    QTime oStartTime;
    QTime oEndTime;
    LARGE_INTEGER ntime1,ntime2;
    LARGE_INTEGER freq;
};
#endif // ITime_H
\

\

我的 CPP 文件

#include <QTime>
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
ITime::ITime()
{    
}
ITime::~ITime()
{   
}
void ITime::start()
{   
    oStartTime = QTime::currentTime(); 
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&ntime1);
}
quint64 ITime::milli()
{   
    quint64 milli =  oStartTime.msecsTo(oEndTime);
    return milli;
}
quint64 ITime::elapsed()
{   
    quint64 ntime = 0;
    QueryPerformanceCounter(&ntime2);
    oEndTime = QTime::currentTime(); 
    ntime = (ntime2.QuadPart-ntime1.QuadPart)/(freq.QuadPart/1000000.0);
    double elapsedMilliseconds = elapsedTicks.QuadPart / (freq.QuadPart/                     1000.0);
qDebug() << "milli seconds by counter :" << elapsedMilliseconds ;
    return ntime;
}
\

\

我的主文件

#include "ITime.h"
#include <iostream>
int main()
{
    ITime time;
    time.start();
    qDebug() << "Start time" << time.oStartTime ;
    qDebug() << "differnce time in micro by counter" << time.elapsed() ;
    qDebug() << "differnce time in milli " << time.milli() ;
    qDebug() << "End time" << time.oEndTime ;
}

我的输出是这样的

开始时间QTime("17:57:46"(计数器毫秒数:1.20633微计数器差分时间:1206使用 QTime 的差分时间(以毫为单位(:0结束时间 QTime("17:57:46"(

在这里,通过考虑输出微秒是计数器的1206,它意味着几乎1毫秒,但在输出毫秒中是QTime的0,那么我怎么能得到相同的毫秒和微秒差异

实际上我想知道为什么QTime和计数器之间存在时间差异

>QueryPerformanceFrequency以"每秒计数"为单位提供计数器频率。这意味着无论QueryPerformanceCounter返回什么,都将与QueryPerformanceFrequency一开始提供的除数来表示。换句话说(假设您可以针对一个对QuadPart进行算术的系统,这是极有可能的(......

LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER startTicks;
QueryPerformanceCounter(&startTicks);
//Do work here
LARGE_INTEGER endTicks;
QueryPerformanceCounter(&endTicks);
LARGE_INTEGER elapsedTicks;
elapsedTicks.QuadPart = endTicks.QuadPart - startTicks.QuadPart;
double elapsedMicoseconds = elapsedTicks.QuadPart / (freq.QuadPart / 1000000.0);
double elapsedMilliseconds = elapsedTicks.QuadPart / (freq.QuadPart / 1000.0);
double elapsedSeconds = elapsedTicks.QuadPart / (double)freq.QuadPart;

。应该回答你的问题。您可以将其分解为任何您认为合适的方式,包括截断为SS.MMMMM(秒和毫秒(等形式。

另请注意,您应该只调用QueryPerformanceFrequency一次并保存结果,因为它在系统启动之间不会更改,并且只是第一次启动后的冗余调用。