最近的项目过程中遇到了一些问题,需要在每天建立一个数据库表格记录相关信息,查找一些文章发现并不能实现对应功能,所以就依靠自己的想法在此献丑了,希望大神能够提出一些意见。
核心的思想就是用Qtimer定时器,网上也有相关的实例,但运用中发现一些问题
QTimer *m_timer;
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(autoKeepSampleTimeOut()));
m_timer->start(1*1000*60); //every 1 minutes ,每分钟调用一次
autoKeepSampleTimeOut()
{
QDateTime datetime = QDateTime::currentDateTime();
if(datetime.toString("hh:mm") == "00:00")
{
//do something
}
}
在此段程序中发现槽函数每分钟触发,但是触发的时间是有误差的。我希望在每天的0:00触发函数,但实际上会根据这段函数的起调时间来判断,并且槽函数被循环调用来对比时间。
最后我用Qtime来获取当先时间,QTime current_time = QTime::currentTime(); 记录当前时间。根据当前时间与下次触发函数的时间差来既定Qtimer的槽函数。
QTime current_time = QTime::currentTime();
QTime next_time;
next_time.setHMS( 0,0,0,0);//设定下次触发的时间,时分秒毫秒
int time_difference=current_time.secsTo(next_time)+24*60*60;
m_timer = new QTimer(this);
m_timer->setSingleShot(1);//定时器单次触发
m_timer->setTimerType(Qt::PreciseTimer);//设置定时器精度
connect(m_timer, SIGNAL(timeout()), this, SLOT(autoKeepSampleTimeOut()));
m_timer->start(time_difference*1000); //到达相应时间时,调用槽函数即可
如此,在每天0:00即可调用触发槽函数,实现相应功能。误差在秒级,对数据影响不大。
autoKeepSampleTimeOut()
{
delete m_timer;//手动释放内存
m_timer = new QTimer(this);
m_timer->setSingleShot(1);//定时器单次触发
m_timer->setTimerType(Qt::PreciseTimer);//设置定时器精度
int msec =QTime::currentTime().msec();//获取当前毫秒数,进行定时器校准
connect(m_timer, SIGNAL(timeout()), this, SLOT(autoKeepSampleTimeOut()));
m_timer->start(24*60*60*1000-msec); //到达相应时间时,调用槽函数即可
}
如果想实现程序多天运行,每天都能够调用槽函数,记得在槽函数中重新调用定时器,不然定时器所设定的时间有误。