На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Как измерить степень загруженности процессора
    Может кто знает как можно измерить процент  загруженности процессора? И как узнать процент использования памяти?
      Для памяти можно попробывать VirtualQuery. Для проца тоже что-то похожее было, непомню
        Для измерения загруженности памяти есть GlobalMemoryStatus.

        Для проца под 9х незнаю (т.к. не пользуюсь :)) А под NT/2k/xp смотри FAQ
        или иди сюды http://www.vcl.ru/html/source/cpu/
          Всем спасибо... Теперь осталось только узнать как на Borland C++ 5.02  screen saver правильно написать...  :-/
            Сайтик изменился... Дайте плз ссылочку еще раз.
            И... А как процессы на многоядерных процах распределять?... Шото никак не найду... <_<
              В свое время написал такой класс:
              UprocessInfo.h
              Скрытый текст
              ExpandedWrap disabled
                //---------------------------------------------------------------------------
                 
                #ifndef UProcessInfoH
                #define UProcessInfoH
                //---------------------------------------------------------------------------
                #include <windows.h>
                #include <winternl.h>
                #include <process.h>
                #include <Psapi.h>
                #include <Tlhelp32.h>
                #pragma comment(lib, "psapi.lib")
                 
                #define STATUS_SUCCESS  (NTSTATUS)0x00000000L
                 
                struct ProcInfoStruc
                {
                    int cpu_proc_usage;
                    __int64 mem_total_kb;
                        __int64 mem_avail_kb;
                    __int64 mem_proc_usage_kb;
                    __int64 ThreadsCount;
                    int mem_load;
                };
                 
                class ProcessInfoSys
                {
                public:
                    bool GetProcInfoSysEx(HANDLE hProcess, ProcInfoStruc *pstruc, char* FullExePath);
                    HANDLE GetProcHandle(char* ProcName);
                };
                SYSTEM_BASIC_INFORMATION    sysinfo;
                ULONG                   ReturnLength;
                #endif


              UProcessInfo.cpp
              Скрытый текст

              ExpandedWrap disabled
                //---------------------------------------------------------------------------
                #include "UProcessInfo.h"
                #pragma hdrstop
                #pragma package(smart_init)
                //---------------------------------------------------------------------------
                HANDLE ProcessInfoSys::GetProcHandle(char* ProcName)
                {
                    HANDLE hProcess;
                    TCHAR buff[MAX_PATH];
                 
                    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                 
                    if(hSnapshot == INVALID_HANDLE_VALUE) return NULL;
                 
                    PROCESSENTRY32 pe;
                    pe.dwSize = sizeof pe;
                 
                    BOOL result = Process32First(hSnapshot, &pe);
                 
                    while(result)
                    {
                        BOOL eq = lstrcmpi(pe.szExeFile, ProcName);
                        if(eq)
                        {
                            GetFileTitle(pe.szExeFile, buff, MAX_PATH);
                            eq = lstrcmpi(buff, ProcName);
                        }
                        if(eq)
                        {
                            GetShortPathName(pe.szExeFile, buff, MAX_PATH);
                            eq = lstrcmpi(buff, ProcName);
                        }
                        if(!eq)
                        {
                            CloseHandle(hSnapshot);
                            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
                            if(hProcess == NULL) return NULL;
                            else return hProcess;
                        }
                        result = Process32Next(hSnapshot, &pe);
                    }
                    CloseHandle(hSnapshot);
                    return NULL;
                }
                //-------------------------------------------------------------------------------------------------------------------
                bool ProcessInfoSys::GetProcInfoSysEx(HANDLE hProcess, ProcInfoStruc *pstruc, char* ProcName)
                {
                //********************************************************************************************************************
                    FILETIME  ftCreationTime; //***************************************
                    FILETIME  ftExitTime;     // Временные значения, возвращаемые функцией
                    FILETIME  ftKernelTime;   // GetProcessTimes()
                    FILETIME  ftUserTime;    //***************************************
                 
                    SYSTEMTIME stCreationTime;//***************************************
                    SYSTEMTIME stExitTime;    // Временные переменные системного формата
                    SYSTEMTIME stKernelTime;  // сюда будут сконвертены переменный , возвращаемые функцией  GetProcessTimes()
                    SYSTEMTIME stUserTime;   //***************************************
                 
                    MEMORYSTATUS  memstat;   // переменная под общее состояние физической памяти
                    PROCESS_MEMORY_COUNTERS memprocstat; // структура под инфу о памяти, занимаемой одним процессом
                 
                    __int64 oldtime = 0;  // переменные под расчет уровня загрузки процеесора
                    __int64 newtime = 0;  // одним процессом
                //********************************************************************************************************************
                    // получаем информацию о процессе по звременным затратам
                    if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime)) return false;
                    // переводим полученные данные в формат SYSTEMTIME
                    if(!FileTimeToSystemTime(&ftCreationTime, &stCreationTime)) return false;
                    if(!FileTimeToSystemTime(&ftKernelTime, &stKernelTime)) return false;
                    if(!FileTimeToSystemTime(&ftUserTime, &stUserTime)) return false;
                    // cуммируем общие затраты времени процессора одним процессом
                    oldtime = stKernelTime.wMilliseconds + stKernelTime.wSecond*1000 +  stKernelTime.wMinute*60000 + stCreationTime.wHour*60*60000;
                    oldtime += stUserTime.wMilliseconds + stUserTime.wSecond*1000 +  stUserTime.wMinute*60000 + stUserTime.wHour*60*60000;
                 
                    //************** ждем одну секунду и снова снимаем показания ************
                    Sleep(1000);
                    // получаем информацию о процессе по звременным затратам
                    if(!GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime)) return false;
                    // переводим полученные данные в формат SYSTEMTIME
                    if(!FileTimeToSystemTime(&ftCreationTime, &stCreationTime)) return false;
                    if(!FileTimeToSystemTime(&ftKernelTime, &stKernelTime)) return false;
                    if(!FileTimeToSystemTime(&ftUserTime, &stUserTime)) return false;
                    // cуммируем общие затраты времени процессора одним процессом
                    newtime = stKernelTime.wMilliseconds + stKernelTime.wSecond*1000 +  stKernelTime.wMinute*60000 + stCreationTime.wHour*60*60000;
                    newtime += stUserTime.wMilliseconds + stUserTime.wSecond*1000 +  stUserTime.wMinute*60000 + stUserTime.wHour*60*60000;
                    // получаем количество процессоров
                    NTSTATUS (WINAPI *pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID,ULONG,PULONG);
                    HMODULE hModule=LoadLibrary("Ntdll.dll");
                    pNtQuerySystemInformation = (NTSTATUS (WINAPI*)(SYSTEM_INFORMATION_CLASS,PVOID,ULONG,PULONG))GetProcAddress(hModule,"NtQuerySystemInformation");
                    if(pNtQuerySystemInformation==NULL) abort();
                    if(((pNtQuerySystemInformation)(SystemBasicInformation,&sysinfo, sizeof(sysinfo),&ReturnLength))!=STATUS_SUCCESS) abort();
                 
                    // высчитываем разницу во времени и делим на 10
                    // и записываем все это в структуру
                 
                    try
                    {
                        pstruc->cpu_proc_usage = int((newtime - oldtime)/10);
                        if(pstruc->cpu_proc_usage > 100) pstruc->cpu_proc_usage = 100;
                        if(pstruc->cpu_proc_usage) pstruc->cpu_proc_usage /= sysinfo.NumberOfProcessors;
                 
                    }
                    catch(...) {return false;}
                    
                    // смотрим общее состояние физической памяти
                    GlobalMemoryStatus(&memstat);
                    // записываем показания в структуру
                    try
                    {
                        pstruc->mem_total_kb = int(memstat.dwTotalPhys/1024);
                        pstruc->mem_avail_kb = int(memstat.dwAvailPhys/1024);
                        pstruc->mem_load = memstat.dwMemoryLoad;
                    }
                    catch(...) {return false;}
                    // смотрим, сколько памяти занимает выбраный процесс
                    GetProcessMemoryInfo(hProcess, &memprocstat, sizeof(memprocstat));
                    // записываем показания в структуру
                    try
                    {
                        pstruc->mem_proc_usage_kb = int(memprocstat.WorkingSetSize/1024);
                    }
                    catch(...) {return false;}
                 
                        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                 
                    if(hSnapshot == INVALID_HANDLE_VALUE) return NULL;
                 
                    PROCESSENTRY32 pe;
                    pe.dwSize = sizeof pe;
                    TCHAR buff[MAX_PATH];
                    
                    BOOL result = Process32First(hSnapshot, &pe);
                 
                    while(result)
                    {
                        BOOL eq = lstrcmpi(pe.szExeFile, ProcName);
                        if(eq)
                        {
                            GetFileTitle(pe.szExeFile, buff, MAX_PATH);
                            eq = lstrcmpi(buff, ProcName);
                        }
                        if(eq)
                        {
                            GetShortPathName(pe.szExeFile, buff, MAX_PATH);
                            eq = lstrcmpi(buff, ProcName);
                        }
                        if(!eq)
                        {
                            CloseHandle(hSnapshot);
                            pstruc->ThreadsCount = pe.cntThreads;
                            if(hProcess == NULL) return NULL;
                            else return hProcess;
                        }
                        result = Process32Next(hSnapshot, &pe);
                    }
                    CloseHandle(hSnapshot);
                 
                 
                    return true;
                }            
                //----------------------------------------------------------------------------

                Цитата bpiter @
                Сайтик изменился... Дайте плз ссылочку еще раз.
                И... А как процессы на многоядерных процах распределять?... Шото никак не найду... <_<

                Как узнать загруженность процессора?
                вроде 2й параметр в PdhAddCounter поменять для многопроцессорных

                mr.Torrens, а твой класс верно показывает? просто как то нестандартно....
                  Цитата ElcnU @
                  Цитата bpiter @
                  Сайтик изменился... Дайте плз ссылочку еще раз.
                  И... А как процессы на многоядерных процах распределять?... Шото никак не найду... <_<

                  Как узнать загруженность процессора?
                  вроде 2й параметр в PdhAddCounter поменять для многопроцессорных

                  mr.Torrens, а твой класс верно показывает? просто как то нестандартно....

                  Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного?

                  Добавлено
                  В MSDN есть подобный пример.
                    Цитата mr.Torrens @
                    Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного?


                    как распределяется по самим процессорам?
                    для 30 процессов ждать 30 секунд? хм <_<

                    ну ладно, дело личное
                      Цитата ElcnU @
                      Цитата mr.Torrens @
                      Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного?


                      как распределяется по самим процессорам?
                      для 30 процессов ждать 30 секунд? хм <_<

                      ну ладно, дело личное

                      Зачем? 1 секунда как и для одного, и для двух. Я например тестировал этот код на 2х процессорном проце, то значения совпадали со значениями ProcessExplorer. Если не нравится такой алгоритм, это дело личное, никому ничего не навязываю, если можешь, предложи свой.

                      Добавлено
                      Да и автор темы явно использует конфигурацию не с 30-ю процессорами
                        Цитата mr.Torrens @
                        если можешь, предложи свой.

                        в посте ссылка, если не поглазам было, там есть примеры, как для NT так и для 9x
                          Да если нужно получить общую загрузку, так пожалуй удобнее. Я с самого начала говорил, что мне нужно было получать загрузку проца конкретным процессом.
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0394 ]   [ 15 queries used ]   [ Generated: 18.05.24, 14:47 GMT ]