作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个简单的演示来检查单次定时器的准确性。以下是我的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//two singleshot timers
QTimer::singleShot(1000,Qt::PreciseTimer,this,SLOT(myslot1()));
QTimer::singleShot(10000,Qt::PreciseTimer,this,SLOT(myslot2()));
//metrics of timing accuraccy
t = 0;
timer = new QTimer();
timer->setInterval(100);
timer->setTimerType(Qt::PreciseTimer);
connect(timer,SIGNAL(timeout()),this,SLOT(timerhandler()),Qt::DirectConnection);
timer->start();
}
void MainWindow::myslot1()
{
qDebug()<<"myslot1 called: t="<<100*t;
ui->lcdNumber1->display(1);
}
void MainWindow::myslot2()
{
qDebug()<<"myslot2 called: t="<<100*t;
ui->lcdNumber2->display(2);
}
void MainWindow::timerhandler()
{
t++;
ui->lcdNumber->display(t*100);
}
运行这些代码给出:
myslot1 called: t= 900
myslot2 called: t= 9900
在我看来,对于精确计时器,大约有 100 毫秒的计时误差。我说的对吗??明显的错误是因为我为 timer
设置的时间间隔吗?根据一些帖子 ( QTimer not accurate at all? ),QTimer 可能根本不那么准确。
最佳答案
如果你想要 2 个事件之间的时间,你必须使用 QElapsedTimer
:
例子:
#include <QtCore>
class Foo: public QObject
{
Q_OBJECT
public:
Foo(QObject *parent=nullptr):
QObject(parent),
timer(new QTimer())
{
QTimer::singleShot(1000,Qt::PreciseTimer,this, &Foo::myslot1);
QTimer::singleShot(10000,Qt::PreciseTimer,this, &Foo::myslot2);
timer->setInterval(100);
timer->setTimerType(Qt::PreciseTimer);
connect(timer,&QTimer::timeout,this,&Foo::timerhandler,Qt::DirectConnection);
timer->start();
timer_measure.start();
}
private:
Q_SLOT void myslot1(){
qDebug()<< __PRETTY_FUNCTION__ << timer_measure.elapsed();
}
Q_SLOT void myslot2(){
qDebug()<< __PRETTY_FUNCTION__ << timer_measure.elapsed();
}
void timerhandler()
{
qDebug()<< __PRETTY_FUNCTION__ << timer_measure.elapsed();
}
QElapsedTimer timer_measure;
QTimer *timer;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Foo foo;
return a.exec();
}
#include "main.moc"
输出:
void Foo::timerhandler() 100
void Foo::timerhandler() 200
void Foo::timerhandler() 301
void Foo::timerhandler() 400
void Foo::timerhandler() 500
void Foo::timerhandler() 600
void Foo::timerhandler() 700
void Foo::timerhandler() 800
void Foo::timerhandler() 900
void Foo::myslot1() 1000
void Foo::timerhandler() 1001
void Foo::timerhandler() 1100
void Foo::timerhandler() 1200
void Foo::timerhandler() 1300
void Foo::timerhandler() 1401
void Foo::timerhandler() 1500
void Foo::timerhandler() 1600
void Foo::timerhandler() 1700
void Foo::timerhandler() 1801
void Foo::timerhandler() 1900
void Foo::timerhandler() 2000
void Foo::timerhandler() 2100
void Foo::timerhandler() 2201
void Foo::timerhandler() 2300
void Foo::timerhandler() 2400
void Foo::timerhandler() 2500
void Foo::timerhandler() 2600
void Foo::timerhandler() 2700
void Foo::timerhandler() 2800
void Foo::timerhandler() 2901
void Foo::timerhandler() 3000
void Foo::timerhandler() 3100
void Foo::timerhandler() 3200
void Foo::timerhandler() 3301
void Foo::timerhandler() 3400
void Foo::timerhandler() 3500
void Foo::timerhandler() 3600
void Foo::timerhandler() 3701
void Foo::timerhandler() 3800
void Foo::timerhandler() 3900
void Foo::timerhandler() 4000
void Foo::timerhandler() 4101
void Foo::timerhandler() 4200
void Foo::timerhandler() 4300
void Foo::timerhandler() 4400
void Foo::timerhandler() 4501
void Foo::timerhandler() 4600
void Foo::timerhandler() 4700
void Foo::timerhandler() 4800
void Foo::timerhandler() 4901
void Foo::timerhandler() 5000
void Foo::timerhandler() 5100
void Foo::timerhandler() 5200
void Foo::timerhandler() 5300
void Foo::timerhandler() 5400
void Foo::timerhandler() 5500
...
关于c++ - Qt精密定时器计时精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168709/
这是一项家庭作业。除了这一件之外,我已经完成了所有编码。这是它应该是什么样子的一个例子。除了员工姓名 Employee's Pay RegHours Gross Fed
在过去的一个小时里,我一直在尝试在我的 Activity 的特定位置放置一个View(准确地说是一个ProgressBar),但无济于事。我的 Activity 有背景图片,我需要将进度条与其对齐。这
我是一名优秀的程序员,十分优秀!