PDA

Просмотр полной версии : получить время ЦП для выбранного процесса


transserg
11.12.2009, 16:00
привет всем.... есть задача получить список процессов и получить загрузку цп каждым процессом за последнюю секунду... в принципе все это работает и сделано... НО препод заявляет типа загрузку цп лучше считать с помощью NtQuerySystemInformation для каждого процесса но с этим проблема как? каков алгоритм? сейчас все сделано так список процессов через NtQuerySystemInformation загрузку ЦП через GetProcessTimes
но мне не оч нравится такой метод... есть ли альтернатива?

DeaD_MoroZ
11.12.2009, 17:25
привет всем.... есть задача получить список процессов и получить загрузку цп каждым процессом за последнюю секунду... в принципе все это работает и сделано... НО препод заявляет типа загрузку цп лучше считать с помощью NtQuerySystemInformation для каждого процесса но с этим проблема как? каков алгоритм? сейчас все сделано так список процессов через NtQuerySystemInformation загрузку ЦП через GetProcessTimes
но мне не оч нравится такой метод... есть ли альтернатива?
или я совсем дурак или что то ещё... но ты сам себе противоречишь в написаном(= я 5 раз прочитал но всё равно не понял что тебе надо(и опять не в там написали... есть же тред для студентов...)

transserg
11.12.2009, 17:29
DeaD_MoroZ в чем? мне надо получить загрузку цп для процесса... спомошью NtQuerySystemInformation если такое возможно..... сейчас этоже задание сделано через GetProcessTimes

_antony
11.12.2009, 19:40
НО препод заявляет типа загрузку цп лучше считать с помощью NtQuerySystemInformation для каждого процесса

Это в каком пту?
.text:7C835241 ; BOOL __stdcall GetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime) .text:7C835241 public GetProcessTimes .text:7C835241 GetProcessTimes proc near
.....

mov edi, edi
.text:7C835243 push ebp
.text:7C835244 mov ebp, esp
.text:7C835246 sub esp, 20h
.text:7C835249 push 0
.text:7C83524B push 20h
.text:7C83524D lea eax, [ebp+var_20]
.text:7C835250 push eax
.text:7C835251 push 4
.text:7C835253 push [ebp+hProcess]
.text:7C835256 call ds:NtQueryInformationProcess

transserg
11.12.2009, 19:46
_antony далеко не ПТУ =) прост у него привычка сбивать с толку... даже глядя в методички что есть там куча ошибок =) да и ще он как то заявил что ПРИМЕР из методичке не должен работать....
тему можно закрыть.. так как решение найдено останусь на прежнем варианте...

Gar|k
11.12.2009, 20:07
Немного не в тему но может кому пригодится.


//---------

#include "stdio.h"
#include "windows.h"

//---------

typedef DWORD (__stdcall *LPFN_NtQuerySystemInformation)(DWORD, PVOID, DWORD, PDWORD);

#define SystemProcessorPerformanceInformation 0x8

//---------

#pragma pack(push,8)

typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
LARGE_INTEGER IdleTime;
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER DpcTime;
LARGE_INTEGER InterruptTime;
ULONG InterruptCount;
} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION,
*PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;

#pragma pack(pop)

//---------

int main(int argc, char* argv[]) {

SYSTEM_INFO systeminfo;
unsigned long bytesreturned;

SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION spi_old[32];
memset(spi_old,0,sizeof(SYSTEM_PROCESSOR_PERFORMAN CE_INFORMATION)*32);

SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION spi[32];
memset(spi,0,sizeof(SYSTEM_PROCESSOR_PERFORMANCE_I NFORMATION)*32);

LPFN_NtQuerySystemInformation ntquerysysteminformation =(LPFN_NtQuerySystemInformation) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");

if(!ntquerysysteminformation) {

printf("\n*** no ntquerysysteminformation api?.. bugger");
return -1;
}

GetSystemInfo(&systeminfo);

printf("\n[i] Processor Count: %d\n",systeminfo.dwNumberOfProcessors);

ntquerysysteminformation(SystemProcessorPerformanc eInformation,spi_old, (sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)* systeminfo.dwNumberOfProcessors),&bytesreturned);

Sleep(500);

ntquerysysteminformation(SystemProcessorPerformanc eInformation,spi, (sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)* systeminfo.dwNumberOfProcessors),&bytesreturned);

for(int cpuloopcount = 0; cpuloopcount < systeminfo.dwNumberOfProcessors; cpuloopcount++) {

BYTE cpuusage = (BYTE) (100 - (((spi[cpuloopcount].IdleTime.QuadPart - spi_old[cpuloopcount].IdleTime.QuadPart) * 100) / \
((spi[cpuloopcount].KernelTime.QuadPart + spi[cpuloopcount].UserTime.QuadPart) - (spi_old[cpuloopcount].KernelTime.QuadPart + spi_old[cpuloopcount].UserTime.QuadPart))));

printf("\n[i] CPU %02d: = %0d%%",cpuloopcount, cpuusage);

}
return 0;
}

DeaD_MoroZ
11.12.2009, 21:24
_antony далеко не ПТУ =) прост у него привычка сбивать с толку... даже глядя в методички что есть там куча ошибок =) да и ще он как то заявил что ПРИМЕР из методичке не должен работать....
тему можно закрыть.. так как решение найдено останусь на прежнем варианте...
видел много примеров из методичек которые ни фига не работают(=