怎么才能知道某个进程CPU的占用率是多少??

解决方案 »

  1.   

    在进程中加入  sleep(1)
      

  2.   

    浅谈系统的非定时自动关机
    作者:杨立刚
    下载源代码 
        我们经常遇见定时关机的情况,我在此提出的非定时关机,是应用在我们不能预料我们的作业什么时候完成的情况下,举个例子:本人平时在用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. 
      

  3.   

    //ij½ø³Ìµ±Ç°Õ¼ÓÃCPUµÄ°Ù·Ö±È
    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;     //&Atilde;&para;&frac34;&Ugrave;&frac12;&oslash;&sup3;&Igrave;
        hToolProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if((INT)hToolProcess>0)
    {
    process.dwSize=sizeof(process);
        if(Process32First(hToolProcess,&process)==TRUE)
    {
    do 
    {
    //&Atilde;&para;&frac34;&Ugrave;&frac12;&oslash;&sup3;&Igrave;&Ouml;&ETH;&micro;&Auml;&Auml;&pound;&iquest;é
                    hToolModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,process.th32ProcessID);
                        if((INT)hToolModule>0)
    {
    module.dwSize=sizeof(module);
        if(Module32First(hToolModule,&module)==TRUE)
    {
    do 
    {
    strResult=module.szExePath;       //&frac12;&oslash;&sup3;&Igrave;&Eacute;&aelig;&frac14;°&micro;&Auml;&Icirc;&Auml;&frac14;&thorn;
    //&Otilde;&Ograve;&micro;&frac12;&Iuml;à&sup1;&Oslash;&frac12;&oslash;&sup3;&Igrave;&micro;&Auml;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;
    if(strResult.CompareNoCase(ExePathName)==0)
    {
    //&micro;±&frac12;&oslash;&sup3;&Igrave;ID=0,&Otilde;&acirc;&cedil;&ouml;ID&ordm;&Aring;&Icirc;&THORN;·¨&raquo;&ntilde;&micro;&Atilde;CPU&Ecirc;±&frac14;&auml;
    if(process.th32ProcessID!=0)
    {
    //&frac12;&laquo;&micro;±&Ccedil;°&frac12;&oslash;&sup3;&Igrave;ID&cedil;&sup3;&cedil;&oslash;±&auml;&Aacute;&iquest;
    ProcessID=process.th32ProcessID;
    break;
    }
    }
    }while(Module32Next(hToolModule,&module)==TRUE);
    }
        CloseHandle(hToolModule);
    } //&Ograve;&Ntilde;&frac34;&shy;&Otilde;&Ograve;&micro;&frac12;&cedil;&Atilde;EXE&micro;&Auml;ID
    if(ProcessID>0)
    break;
    }while(Process32Next(hToolProcess,&process)==TRUE);
    }
        CloseHandle(hToolProcess);
    }
    } //&Egrave;&ccedil;&sup1;&ucirc;&Atilde;&raquo;&Oacute;&ETH;&Otilde;&Ograve;&micro;&frac12;&AElig;&yen;&Aring;&auml;&micro;&Auml;EXE,ProcessID&Ograve;&Agrave;&frac34;&Eacute;&Ecirc;&Ccedil;-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; //&ordm;&Euml;&ETH;&Auml;&Ecirc;±&frac14;&auml;
    u64Buff.HighPart=KernelTime.dwHighDateTime;
    u64Buff.LowPart=KernelTime.dwLowDateTime; 
    u64LastProcess.QuadPart+=u64Buff.QuadPart;  //&Oacute;&Atilde;&raquo;§&Ecirc;±&frac14;&auml;
    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;    //&ordm;&Euml;&ETH;&Auml;&Ecirc;±&frac14;&auml;
        u64Buff.HighPart=KernelTime.dwHighDateTime;
        u64Buff.LowPart=KernelTime.dwLowDateTime; 
        u64ThisProcess.QuadPart+=u64Buff.QuadPart;     //&Oacute;&Atilde;&raquo;§&Ecirc;±&frac14;&auml;
        u64Buff.HighPart=UserTime.dwHighDateTime;
        u64Buff.LowPart=UserTime.dwLowDateTime; 
        u64ThisProcess.QuadPart+=u64Buff.QuadPart; 
                    
    CloseHandle(hProcess); //&frac12;&oslash;&sup3;&Igrave;&Ecirc;±&frac14;&auml;&sup2;&icirc;&sup3;&yacute;10000000(100&Auml;&Eacute;&Atilde;&euml;&micro;&yen;&Icirc;&raquo;)*100
    return (LONG)(u64ThisProcess.QuadPart-u64LastProcess.QuadPart)/100000;
    }