Qt每天在固定时间执行一段程序(定时计划/定时任务)

    最近的项目过程中遇到了一些问题,需要在每天建立一个数据库表格记录相关信息,查找一些文章发现并不能实现对应功能,所以就依靠自己的想法在此献丑了,希望大神能够提出一些意见。

   核心的思想就是用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); //到达相应时间时,调用槽函数即可
 
}

如果想实现程序多天运行,每天都能够调用槽函数,记得在槽函数中重新调用定时器,不然定时器所设定的时间有误。

Qt每天在固定时间执行一段程序(定时计划/定时任务)_第1张图片

 

 

 

你可能感兴趣的:(Qt,Qtimer)