浅谈系统的非定时自动关机 作者:杨立刚 下载源代码 我们经常遇见定时关机的情况,我在此提出的非定时关机,是应用在我们不能预料我们的作业什么时候完成的情况下,举个例子:本人平时在用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里训练完立即保存数据。也许这样的情况大家很少能遇到,我这种方法很简单很直接,希望广大读者给出好的方法或建议。
作者:杨立刚
下载源代码
我们经常遇见定时关机的情况,我在此提出的非定时关机,是应用在我们不能预料我们的作业什么时候完成的情况下,举个例子:本人平时在用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里训练完立即保存数据。也许这样的情况大家很少能遇到,我这种方法很简单很直接,希望广大读者给出好的方法或建议。
Copyright© 1999-2003 vckbase.com All Rights Reserved.
long CSysInformationDoc::GetProcessCPUPercent(long ProcessID,LPCTSTR ExePathName)
{
// TODO: Add your dispatch handler code here
//Èç¹ûProcessID=-1,±íʾÐèÒªÏÈʹÓÃExe¾ø¶Ô·¾¶À´»ñµÃProcessID
CString strResult; if(ProcessID<0)
{
HANDLE hToolProcess;
PROCESSENTRY32 process; HANDLE hToolModule;
MODULEENTRY32 module; //ö¾Ù½ø³Ì
hToolProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if((INT)hToolProcess>0)
{
process.dwSize=sizeof(process);
if(Process32First(hToolProcess,&process)==TRUE)
{
do
{
//ö¾Ù½ø³ÌÖеÄÄ£¿é
hToolModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,process.th32ProcessID);
if((INT)hToolModule>0)
{
module.dwSize=sizeof(module);
if(Module32First(hToolModule,&module)==TRUE)
{
do
{
strResult=module.szExePath; //½ø³ÌÉæ¼°µÄÎļþ
//ÕÒµ½Ïà¹Ø½ø³ÌµÄÎļþÃû
if(strResult.CompareNoCase(ExePathName)==0)
{
//µ±½ø³ÌID=0,Õâ¸öIDºÅÎÞ·¨»ñµÃCPUʱ¼ä
if(process.th32ProcessID!=0)
{
//½«µ±Ç°½ø³ÌID¸³¸ø±äÁ¿
ProcessID=process.th32ProcessID;
break;
}
}
}while(Module32Next(hToolModule,&module)==TRUE);
}
CloseHandle(hToolModule);
} //ÒѾ­ÕÒµ½¸ÃEXEµÄID
if(ProcessID>0)
break;
}while(Process32Next(hToolProcess,&process)==TRUE);
}
CloseHandle(hToolProcess);
}
} //Èç¹ûûÓÐÕÒµ½Æ¥ÅäµÄEXE,ProcessIDÒÀ¾ÉÊÇ-1
if(ProcessID<0)
return -1; HANDLE hProcess; ULARGE_INTEGER u64Buff;
ULARGE_INTEGER u64LastProcess;
ULARGE_INTEGER u64ThisProcess; FILETIME CreationTime;
FILETIME ExitTime;
FILETIME KernelTime;
FILETIME UserTime; u64LastProcess.QuadPart=0;
u64ThisProcess.QuadPart=0; hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessID);
if(hProcess==NULL)
return -1; if(GetProcessTimes(hProcess,&CreationTime,&ExitTime,&KernelTime,&UserTime)==FALSE)
return -2; //ºËÐÄʱ¼ä
u64Buff.HighPart=KernelTime.dwHighDateTime;
u64Buff.LowPart=KernelTime.dwLowDateTime;
u64LastProcess.QuadPart+=u64Buff.QuadPart; //Óû§Ê±¼ä
u64Buff.HighPart=UserTime.dwHighDateTime;
u64Buff.LowPart=UserTime.dwLowDateTime;
u64LastProcess.QuadPart+=u64Buff.QuadPart;
CloseHandle(hProcess); Sleep(1000); hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessID);
if(hProcess==NULL)
return -1; if(GetProcessTimes(hProcess,&CreationTime,&ExitTime,&KernelTime,&UserTime)==FALSE)
return -2; //ºËÐÄʱ¼ä
u64Buff.HighPart=KernelTime.dwHighDateTime;
u64Buff.LowPart=KernelTime.dwLowDateTime;
u64ThisProcess.QuadPart+=u64Buff.QuadPart; //Óû§Ê±¼ä
u64Buff.HighPart=UserTime.dwHighDateTime;
u64Buff.LowPart=UserTime.dwLowDateTime;
u64ThisProcess.QuadPart+=u64Buff.QuadPart;
CloseHandle(hProcess); //½ø³Ìʱ¼ä²î³ý10000000(100ÄÉÃ뵥λ)*100
return (LONG)(u64ThisProcess.QuadPart-u64LastProcess.QuadPart)/100000;
}