程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 淺談系統的非定時自動關機

淺談系統的非定時自動關機

編輯:關於VC++

我們經常遇見定時關機的情況,我在此提出的非定時關機,是應用在我們不能預料我們的作業什麼時候完成的情況下,舉個例子:本人平時在用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裡訓練完立即保存數據。也許這樣的情況大家很少能遇到,我這種方法很簡單很直接,希望廣大讀者給出好的方法或建議。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved