【发布时间】:2019-03-14 17:30:19
【问题描述】:
我编写了一个简单的演示来检查单次计时器的准确性。以下是我的代码:
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 可能根本不那么准确。
【问题讨论】:
-
您的时间是使用
QTimer(变量timer)测量的,该变量被明确配置为间隔为100 毫秒——所以我不确定您还有什么期望。抱歉,如果我遗漏了什么。 -
尝试将调试打印也添加到 timerhandler。此外,使用 QElapsedTimer (所有相同,在构造函数中重置)在调试打印中打印时间戳。我认为这应该澄清一些事情,特别是关于插槽被调用的时间和时间点。
-
QTimer并不是为了实现时钟。如果你需要一个时钟,即测量挂钟时间的东西,或者它的流逝(秒表),那么你就会忘记QTimer的存在,一切都会好起来的:在这种情况下,它只是一种干扰。跨度>