我們經常遇見定時關機的情況,我在此提出的非定時關機,是應用在我們不能預料我們的作業什麼時候完成的情況下,舉個例子:本人平時在用matlab運行某算法訓練大量數據時,由於難以判斷其訓練時間長短(有時是幾小時),沒有耐心去等,但我注意到,在訓練數據時,CUP利用一直是100%或100%稍左,我們可以試著自己編個程序來等待CPU利用率為0時關機(即matlab訓練結束時)。但有一點,必須在matlab程序裡有保存數據的代碼,以確保訓練的參數得以保存。
如何得到CPU占用率呢(在Win2k下),本人參考了《編程愛好者》裡《如何取得一台機器的CPU占用率》的程序: 主要是利用 NTDLL.DLL 裡 NtQuerySystemInformation API 函數。 void CAutoShutDownDlg::GetCpuUsage()
{
// get system time
status = NtQuerySystemInformation(3,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
{
MessageBox("failed to get system time!");
}
// get cpu idle time
status = NtQuerySystemInformation(2,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
{
MessageBox("failed to get cpu time");
}
if (liOldIdleTime.QuadPart != 0)
{
// new cpu Time = NewTime - OldTime
dbCpuIdleTime =LI64ToDouble(SysPerfInfo.liIdleTime)-LI64ToDouble(liOldIdleTime);
dbSysTime =LI64ToDouble(SysTimeInfo.liKeSystemTime)-LI64ToDouble(liOldSysTime);
//get cpu usage
unCpuUsage=100 - 100*(dbCpuIdleTime/dbSysTime)/(double)SysBaseInfo.bKeNumberProcessors+0.5;
}
wsprintf(CpuUsage,"%d%%",(UINT)unCpuUsage);
m_sCpuUsage=(CString)CpuUsage;
//if cpu usage ==0% then shutdown os
if(bSetAuto&&(UINT)dbCpuIdleTime==0)
{
//MessageBox("shutdown os!");
ShutDown();
}
// store new cpu idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSysTime = SysTimeInfo.liKeSystemTime;
}
在定時器裡每秒得到CPU的利用率,如果為0關閉系統。關機參數設置如下: ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,NULL);
注意此處我設為強制關機,所以注意要保存當前數據,在matlab裡訓練完立即保存數據。也許這樣的情況大家很少能遇到,我這種方法很簡單很直接,希望廣大讀者給出好的方法或建議。
本文配套源碼