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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by transserg, 11 Dec 2009.

  1. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    привет всем.... есть задача получить список процессов и получить загрузку цп каждым процессом за последнюю секунду... в принципе все это работает и сделано... НО препод заявляет типа загрузку цп лучше считать с помощью NtQuerySystemInformation для каждого процесса но с этим проблема как? каков алгоритм? сейчас все сделано так список процессов через NtQuerySystemInformation загрузку ЦП через GetProcessTimes
    но мне не оч нравится такой метод... есть ли альтернатива?
     
  2. DeaD_MoroZ

    DeaD_MoroZ Banned

    Joined:
    3 Nov 2009
    Messages:
    102
    Likes Received:
    7
    Reputations:
    0
    или я совсем дурак или что то ещё... но ты сам себе противоречишь в написаном(= я 5 раз прочитал но всё равно не понял что тебе надо(и опять не в там написали... есть же тред для студентов...)
     
  3. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    DeaD_MoroZ в чем? мне надо получить загрузку цп для процесса... спомошью NtQuerySystemInformation если такое возможно..... сейчас этоже задание сделано через GetProcessTimes
     
  4. _antony

    _antony Elder - Старейшина

    Joined:
    16 Jul 2008
    Messages:
    80
    Likes Received:
    43
    Reputations:
    0
    Это в каком пту?
    Code:
    .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]
    [COLOR=Red].text:7C835256                 call    ds:NtQueryInformationProcess[/COLOR]
    
     
  5. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    _antony далеко не ПТУ =) прост у него привычка сбивать с толку... даже глядя в методички что есть там куча ошибок =) да и ще он как то заявил что ПРИМЕР из методичке не должен работать....
    тему можно закрыть.. так как решение найдено останусь на прежнем варианте...
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Определяет загрузку ЦП в % для каждого ядра

    Немного не в тему но может кому пригодится.

    Code:
    //---------
    
    #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;
    }
    
     
    _________________________
    1 person likes this.
  7. DeaD_MoroZ

    DeaD_MoroZ Banned

    Joined:
    3 Nov 2009
    Messages:
    102
    Likes Received:
    7
    Reputations:
    0
    видел много примеров из методичек которые ни фига не работают(=