загруженность проца отдельным процессом

Тема в разделе "WASM.WIN32", создана пользователем RamMerLabs, 28 ноя 2006.

  1. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    подскажите, как узнать собственно сабж, если можно, то на с++ или асме.

    заранее благодарен.
     
  2. rd

    rd New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2006
    Сообщения:
    2
    Код (Text):
    1. #include <windows.h>
    2. #include <largeint.h>
    3.  
    4. typedef struct _PROCESS_TIME {
    5.     DWORD dwProcessId;
    6.     LARGE_INTEGER ProcessTime;
    7.     LARGE_INTEGER SystemTime;
    8. } PROCESS_TIME;
    9.  
    10.  
    11. DWORD GetCPUUsageByProcessID(DWORD dwProcessId)
    12. {
    13.     FILETIME ftKernelTime, ftUserTime, ftCreationTime, ftExitTime, ftSystemTime;
    14.     HANDLE hProcess;
    15.     DWORD dwResult;
    16.     LARGE_INTEGER ProcessTime, SystemTime, LargeInteger, Remainder;
    17.     PROCESS_TIME pt;
    18.     static PROCESS_TIME apt[1024] = { 0 };
    19.     int i;
    20.  
    21.     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
    22.     GetProcessTimes(hProcess, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime);
    23.     GetSystemTimeAsFileTime(&ftSystemTime);
    24.  
    25.     CopyMemory(&ProcessTime, &ftUserTime, sizeof(LARGE_INTEGER));
    26.     CopyMemory(&LargeInteger, &ftKernelTime, sizeof(LARGE_INTEGER));
    27.     ProcessTime = LargeIntegerAdd(ProcessTime, LargeInteger);
    28.     CopyMemory(&SystemTime, &ftSystemTime, sizeof(LARGE_INTEGER));
    29.  
    30.     pt.dwProcessId = dwProcessId;
    31.     pt.ProcessTime = ProcessTime;
    32.     pt.SystemTime = SystemTime;
    33.  
    34.     for (i = 0; apt[i].dwProcessId && i < 1024; i++)
    35.         if (apt[i].dwProcessId == dwProcessId)
    36.             break;
    37.    
    38.     ProcessTime = LargeIntegerSubtract(ProcessTime, apt[i].ProcessTime);
    39.     SystemTime = LargeIntegerSubtract(SystemTime, apt[i].SystemTime);
    40.  
    41.     ProcessTime = ExtendedIntegerMultiply(ProcessTime, 100);
    42.     LargeInteger = LargeIntegerDivide(ProcessTime, SystemTime, &Remainder);
    43.     CopyMemory(&dwResult, &LargeInteger, sizeof(DWORD));
    44.  
    45.     apt[i] = pt;
    46.  
    47.     return dwResult;
    48. }
    Наиболее простой вариант, но дает неправильные данные при первом вызове, т.е. для правильного результата нужно вызывать хотя бы 2 раза с небольшой задержкой.

    Или лучше используй PDH API (MSDN)
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426