目录
一、普通定时器
//普通定时器
QTimer* normalTimer=new QTimer;
normalTimer->start(20);
connect(normalTimer,&QTimer::timeout,this,&MainWindow::_20msSlot);
二、QT高精度定时器
//高精度定时器
QTimer* precisionTimer=new QTimer;
precisionTimer->setTimerType(Qt::PreciseTimer);
precisionTimer->start(20);
connect(precisionTimer,&QTimer::timeout,this,&MainWindow::_20msSlot);
时间久了也不准
三、使用CPU时钟作为定时器
void thread1::timerMsByCPU(double mSleepTime)
{
LARGE_INTEGER litmp;
LONGLONG Qpart1,Qpart2;
double dfMinus = 0,dfFreq = 0,dfTime = 0;//不初始化是一个不好的习惯,而且会有bug
//获得CPU计时器的时钟频率
QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart1 = litmp.QuadPart; //开始计时
while((mSleepTime-dfTime*1000.000)>0.0000001){
QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart2 = litmp.QuadPart; //终止计时
dfMinus = (double)(Qpart2 - Qpart1);//计算计数器值
dfTime = dfMinus / dfFreq;//获得对应时间,单位为秒,可以乘1000000精确到微秒级(us)
//qDebug()<<"ms"<<QString::number(dfTime*1000.00,'f',9);
}
qDebug()<<"ms"<<QString::number(dfTime*1000.00,'f',9);
}
精度相对第二种方法高许多