2017-02-10 2 views
0

meine .h-Dateiwarum verschiedene Millisekunden Wert ist immer sowohl im Vergleich zu (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 

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

meine CPP-Datei

#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 y Hauptdatei

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

} 

meine Ausgabe ist wie dieser

starten timeQTime ("17.57.46") Milli Sekunden Zähler: 1,20633 differnce Zeit in Mikro durch den Zähler: 1206 differnce Zeit in milli von QTime mit: 0 Endzeit QTime („17.57.46“)

hier, durch den Ausgang Mikrosekunden unter Berücksichtigung ist 1206 durch den Zähler, ist es fast 1 Millisekunden bedeuten, aber in der Ausgabe Millisekunden 0 durch QTime Wie kann ich das gleiche erreichen? ce in milli & Mikrosekunden

eigentlich möchte ich wissen, warum die differece in der Zeit kommt zwischen QTime und Zähler

+1

Sie haben es mit Ganzzahlen zu tun. 'freq.QuadPart/1000000' wird Präzision wegwerfen, die Sie wahrscheinlich behalten möchten. Möglicherweise ist es dasselbe mit der anderen Abteilung. Ich weiß nicht, ob die Formel richtig ist, aber das Folgende wäre sicherer, vorausgesetzt, dass es den Zähler nicht überläuft: '(1000000 * (nTime2.QuadPart-ntime1.QuadPart))/freq.QuadPart;' –

+0

Wenn Sie kann sich auf Windows 8 oder später verlassen, dann gibt es eingebaute Funktionen zur Kombination von Echtzeit mit QPC namens [GetSystemTimePreciseAsFileTime] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895 (v = vs.85)) .aspx)). Dies gibt eine Genauigkeit von 0,1 Mikrosekunden, was das Beste ist, was man unter Windows bekommen kann. Wie immer mit genauer Zeit auf Windows, ist [dies] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408 (v = vs.85) .aspx) ein Muss. –

+0

Gemäß den Dokumenten von ['QTime :: msecsTo()'] (http://doc.qt.io/qt-5/qtime.html#msecsTo): 1) gibt es ** signed ** 'int' zurück ; 2) es "kann 0 zurückgeben, wenn jede Zeit ungültig ist" (kann mit 'QTime :: isValid()' überprüft werden) –

Antwort

0

QueryPerformanceFrequency liefert die Zählerfrequenz in „Zählungen pro Sekunde“. Das bedeutet, dass QueryPerformanceCounter zurückgibt, wird gegen den Teiler dargestellt, der QueryPerformanceFrequency zur Verfügung gestellt wird. Mit anderen Worten (vorausgesetzt, Sie ein System herstellen kann, um Arithmetik auf QuadPart tut, was sehr wahrscheinlich ist) ...

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; 

... sollte Ihre Frage beantworten. Sie können das auf jede Art und Weise brechen, die Sie für richtig halten, einschließlich des Abschneidens in ein Formular wie SS.MMMMM (Sekunden und Millisekunden).

Beachten Sie auch, dass Sie nur einmal QueryPerformanceFrequency aufrufen und das Ergebnis speichern sollten, da es sich nicht zwischen Systemstart ändert und es sich nur um einen redundanten Anruf nach dem ersten handelt.

Verwandte Themen