2017-02-10 12 views
0

моего .h файлапочему я получаю различное значение миллисекунды в сравнении с обеими (QTime & QueryPerformanceCounter)

#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 

\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

мой каст файл

#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; 
} 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\

m у основной файл

#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 ; 

} 

мой выход, как этот

Start timeQTime ("17:57:46") милли секунд счетчик: 1,20633 времени differnce в микро счетчиком: время 1206 differnce в милли с помощью QTime: 0 времени окончания QTime («17:57:46»)

здесь, рассматривая выходные микросекунд являются 1206 счетчиком, это будет означать почти 1 миллисекунду, но в выходных миллисекундах 0 по QTime , так как я могу получить одинаковые отличия се в милли & микросекунд

на самом деле я хочу знать, почему differece вовремя приходит между QTime и счетчиком

+1

Вы имеете дело с целыми числами. 'freq.QuadPart/1000000' отбросит точность, которую вы, вероятно, захотите сохранить. Потенциально это то же самое с другим подразделением. Я не знаю, правильна ли формула, но следующее было бы безопаснее, если бы она не переполняла числитель: '(1000000 * (ntime2.QuadPart-ntime1.QuadPart))/freq.QuadPart;' –

+0

Если вы могут полагаться на окна 8 или более поздние, тогда есть встроенная функциональность для объединения реального времени с QPC под названием [GetSystemTimePreciseAsFileTime] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895 (v = vs.85) .aspx)). Это дает точность с шагом в 0,1 микросекунды, что лучше всего подходит для Windows. Как всегда с точным временем в окнах, [это] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408 (v = vs.85) .aspx) является обязательным для чтения. –

+0

В соответствии с документами '' QTime :: msecsTo() '] (http://doc.qt.io/qt-5/qtime.html#msecsTo): 1) он возвращает ** подписанный **' int' ; 2) он «может вернуть 0, если какое-либо время недействительно» (может быть проверено с помощью 'QTime :: isValid()') –

ответ

0

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 один раз и сохранить результат, так как он не изменяется между загрузками системы, и это просто избыточный вызов после первого.

 Смежные вопросы

  • Нет связанных вопросов^_^