環境:
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