持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第36天,点击查看活动详情
今天是更文挑战的最后一天,回首这一个的历程,还是让自己养成了一些好的习惯,更文挑战既是一种动力,也是一种更好的学习手段,可以在不断的更文过程中思考每一次更文的创新点、侧重点,能将自己的代码拿出来一起分享,一起交流。
今天主要是说一下工作中遇到的一个时间精度问题,PZT可能很多人没有接触过,包括我也是第一次接触,PZT被称为压电陶瓷传感器,是一种利用电压驱动设备进行微小位移(总位移量大概在几百微米左右),由于PZT具有移动位移步长,因此在驱动该设备的时候需要通过定时器进行精准的控制。
PZT有一个最小移动时间,如果想控制其运动的步长相等,那么对于定时器事件的控制需要绝对的精准,于是我通过多线程的方式测试了Windows电脑下,使用定时器的最小的时间间隔,最小时间间隔的含义就是小于这个时间时,定时器的定时不再准确。
下面直接附上我的代码,有需要的可以自取
首先是mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class myThread : public QThread
{
public:
myThread();
void run();
};
#endif // MYTHREAD_H
然后是mythread.cpp
#include "mythread.h"
#include <QDateTime>
#include <QDebug>
myThread::myThread()
{
}
void myThread::run()
{
qDebug()<<"子线程 id="<<QThread::currentThread(); //打印子线程ID
qint64 old = 0;
for(int i=0;i<100;i++)
{
usleep(50000);
//qDebug()<< QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
QDateTime timeDate = QDateTime::currentDateTime();
qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
qDebug()<<timestamp - old;
old = timestamp;
}
}
最后是main.cpp
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include "mythread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"主线程 id="<<QThread::currentThread(); //打印子线程ID
myThread *mth = new myThread();
mth->start();
return a.exec();
}
项目使用QT写的,创建项目时创建的Qt Console Application
因此没有UI界面出现,直接将数据打印到控制台,为了保证电脑中其它进程的干扰,将测试的结果得到的尽可能准确。
从上述的结果可以看出,每一个两位整数为每休眠50ms和一个for循环的时间间隔,正常来说子线程不会受到主线程的干扰,每一个时间间隔应该固定,但是在实际的运行时间隔时间显然不固定,在测试过程中并没有新开其它的程序和线程,至于原因还需要进一步确定。