Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.66.149] |
|
Сообщ.
#1
,
|
|
|
Может кто знает как можно измерить процент загруженности процессора? И как узнать процент использования памяти?
|
Сообщ.
#2
,
|
|
|
Для памяти можно попробывать VirtualQuery. Для проца тоже что-то похожее было, непомню
|
Сообщ.
#3
,
|
|
|
Для измерения загруженности памяти есть GlobalMemoryStatus.
Для проца под 9х незнаю (т.к. не пользуюсь ) А под NT/2k/xp смотри FAQ или иди сюды http://www.vcl.ru/html/source/cpu/ |
Сообщ.
#4
,
|
|
|
Всем спасибо... Теперь осталось только узнать как на Borland C++ 5.02 screen saver правильно написать... :-/
|
Сообщ.
#5
,
|
|
|
Сайтик изменился... Дайте плз ссылочку еще раз.
И... А как процессы на многоядерных процах распределять?... Шото никак не найду... |
Сообщ.
#6
,
|
|
|
В свое время написал такой класс:
UprocessInfo.h Скрытый текст //--------------------------------------------------------------------------- #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 Скрытый текст //--------------------------------------------------------------------------- #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; } //---------------------------------------------------------------------------- |
Сообщ.
#7
,
|
|
|
Цитата bpiter @ Сайтик изменился... Дайте плз ссылочку еще раз. И... А как процессы на многоядерных процах распределять?... Шото никак не найду... Как узнать загруженность процессора? вроде 2й параметр в PdhAddCounter поменять для многопроцессорных mr.Torrens, а твой класс верно показывает? просто как то нестандартно.... |
Сообщ.
#8
,
|
|
|
Цитата ElcnU @ Цитата bpiter @ Сайтик изменился... Дайте плз ссылочку еще раз. И... А как процессы на многоядерных процах распределять?... Шото никак не найду... Как узнать загруженность процессора? вроде 2й параметр в PdhAddCounter поменять для многопроцессорных mr.Torrens, а твой класс верно показывает? просто как то нестандартно.... Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного? Добавлено В MSDN есть подобный пример. |
Сообщ.
#9
,
|
|
|
Цитата mr.Torrens @ Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного? как распределяется по самим процессорам? для 30 процессов ждать 30 секунд? хм ну ладно, дело личное |
Сообщ.
#10
,
|
|
|
Цитата ElcnU @ Цитата mr.Torrens @ Да, показывает верно, правда я его писал из расчета получать информацию по какому-то одному процессу. Если надо получать общую загрузку процессора, прийдется немного переделать. А что нестандартного? как распределяется по самим процессорам? для 30 процессов ждать 30 секунд? хм ну ладно, дело личное Зачем? 1 секунда как и для одного, и для двух. Я например тестировал этот код на 2х процессорном проце, то значения совпадали со значениями ProcessExplorer. Если не нравится такой алгоритм, это дело личное, никому ничего не навязываю, если можешь, предложи свой. Добавлено Да и автор темы явно использует конфигурацию не с 30-ю процессорами |
Сообщ.
#11
,
|
|
|
Цитата mr.Torrens @ если можешь, предложи свой. в 7м посте ссылка, если не поглазам было, там есть примеры, как для NT так и для 9x |
Сообщ.
#12
,
|
|
|
Да если нужно получить общую загрузку, так пожалуй удобнее. Я с самого начала говорил, что мне нужно было получать загрузку проца конкретным процессом.
|