Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   получить время ЦП для выбранного процесса (https://forum.antichat.xyz/showthread.php?t=162693)

transserg 11.12.2009 16:00

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

DeaD_MoroZ 11.12.2009 17:25

Цитата:

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

или я совсем дурак или что то ещё... но ты сам себе противоречишь в написаном(= я 5 раз прочитал но всё равно не понял что тебе надо(и опять не в там написали... есть же тред для студентов...)

transserg 11.12.2009 17:29

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

_antony 11.12.2009 19:40

Цитата:

Сообщение от transserg
НО препод заявляет типа загрузку цп лучше считать с помощью 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_PERFORMANCE_INFORMATION)*32);

        SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION spi[32];
        memset(spi,0,sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*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(SystemProcessorPerformanceInformation,spi_old, (sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)*systeminfo.dwNumberOfProcessors),&bytesreturned);

        Sleep(500);

        ntquerysysteminformation(SystemProcessorPerformanceInformation,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

Цитата:

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

видел много примеров из методичек которые ни фига не работают(=


Время: 18:01