环境:
linux系统下的界面开发:Qt 4.8.6
问题阐述:
1、功能点:(1)设备在5分钟内无操作后,会自动关机:创建了一个定时器,通过elapsed()函数检测时间是否累计到300s,累计到300s之后设备自动关机
(2)设置界面的时间选项,用户可更改系统时间,程序会通过下发Date命令将用户设置的系统时间设置到系统中去
2、问题现象:相应用户设置系统时间的保存信号后,设备立马自动关机
代码分析:
先执行SetDatetimeA6G2C函数
void PublicMethod::SetDatetimeA6G2C(QDateTime datetime)//设置系统的日期时间
{
QString timeStr = datetime.toString("yyyy-MM-dd HH:mm:ss");
QString cmdLine = "date -s \""+timeStr+"\"";
ExecuteCmdLine(cmdLine);
ExecuteCmdLine("hwclock -w &");
}
再执行 OperateMachine
void PublicMethod::OperateMachine() //操作了仪器
{
int msecs = s_timeLastOperate.elapsed();
quint64 newTotalRunSec = s_nu64TotalRunSec+(msecs/1000)+(msecs%1000>500?1:0);
SetLocalTotalRunSec(newTotalRunSec);
s_timeLastOperate.restart();
}
连接信号如下:
每3000ms触发一次槽函数,判断累计无操作时间是否超过3000ms
在判断过程中使用了elapsed()函数
void Dialog_Sample::initAutoPowerOffTimer()
{
m_timerAutoPowerOff = Singletons::GetGlobalAutoPowerOffTimer();//new QTimer(this);
connect(m_timerAutoPowerOff, SIGNAL(timeout()), this, SLOT(autoPowerOff()));
m_timerAutoPowerOff->start(3000);
}
void Dialog_Sample::autoPowerOff()
{
if(PublicMethod::s_timeLastOperate.elapsed() >= 300000)
{
//PublicMethod::OperateMachine();
PublicMethod::ClearPowerOffValue();
if(Singletons::GetGlobalWifiManager()->GetConnectStatus() != false && Singletons::GetGlobalNetworkServer()->GetClientConnectState() != false)
{
//WIFI连接,socket也连接,说明正在互联,不关机
return;
}
//正在采样不关机
if(m_bStart)
{
return;
}
Singletons::GetGlobalAuditTrailBusinessLogic()->PowerOff();
PublicMethod::Shutdown();
}
}
问题原因:
当Date设置时间后,elapsed()函数获取到的值不正确,导致
if(PublicMethod::s_timeLastOperate.elapsed() >= 300000)
条件成立,执行关机命令,设备关机
所以,不能在使用elapsed()函数时 使用Date设置系统时间,否则elapsed()函数获取的值是错误的
该问题现象出现在 用Date命令将时间设置为原系统时间之前的时候, 用Date命令向后设置时间不会出现这种情况
参考文献:
https://blog.csdn.net/beyondfengyu/article/details/52202860