Visual Studio C++精確計時
阿新 • • 發佈:2018-11-19
VS利用QueryPerformanceCounter語句,提供了精確計時的功能,下面用一個簡單的例子來展示其使用辦法。
例子中,採用Qt的startTimer函式,實現每隔500毫秒觸發一次timerEvent()。但是由於qt的timer並不那麼準確,造成timerEvent不能保證精確的按照0.5秒來觸發。QueryPerformanceCounter就是用來精確的記下每次觸發的時間點。記錄的時間點通過qDebug打印出來。
標頭檔案:
#pragma once #include <QtWidgets/QMainWindow> #include "ui_TimeCounter.h" #include <QTimerEvent> #include <Windows.h>//不可少 #include <mmsystem.h>//不可少 class TimeCounter : public QMainWindow { Q_OBJECT public: TimeCounter(QWidget *parent = Q_NULLPTR); LARGE_INTEGER m_nBegin; LARGE_INTEGER m_nFreq; private: Ui::TimeCounterClass ui; protected: void timerEvent(QTimerEvent *); };
cpp檔案
#include "TimeCounter.h" #include <qdebug.h> #pragma comment(lib, "winmm.lib")//不可少 TimeCounter::TimeCounter(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); startTimer(500); QueryPerformanceFrequency(&m_nFreq);//獲取頻率 QueryPerformanceCounter(&m_nBegin);//獲取起始時間 } void TimeCounter::timerEvent(QTimerEvent * e) { LARGE_INTEGER nTime; QueryPerformanceCounter(&nTime);//獲取時間 //計算從起始時間開始,到當前的時間間隔,單位毫秒 int iInterval = (nTime.QuadPart - m_nBegin.QuadPart) / (double)m_nFreq.QuadPart * 1000; qDebug() << iInterval<<" ms"; }
效果:
可見,相鄰時間點之間的間隔並不嚴格等於500毫秒