Click here to Skip to main content
11,430,708 members (76,660 online)
Click here to Skip to main content

Get CPU Usage with GetSystemTimes

, 20 Dec 2004 Public Domain
Rate this:
Please Sign up or sign in to vote.
Get CPU usage with GetSystemTimes.
  • Download source code - 25.4 Kb

      Introduction

      From a very long time, a lot of people wanted to get the CPU usage from the computer.

      You've a lot of way to do this like calling registry like key or PerfCounter. But TaskManager doesn't call any of these ... If you're looking from the import table of TaskManager you can find:

      ntdll.dll
        Import Adress Table: 0x00001414
        Import Name Table: 0x00013C2C
            0x7C90E213 260 NtQueryVirtualMemory
            0x7C90DDF9 209 NtOpenThread
            0x7C90D586 103 NtClose
            ....
            0x7C90E1AA 255 NtQuerySystemInformation
            .... 
      

      So there is no other solution to have this information to dig into undocumented NtQuerySystemInformation. With this nice warning at the beginning of the article:[ NtQuerySystemInformation is available for use in Windows 2000 and Windows XP. It may be altered or unavailable in subsequent versions. Applications should use the alternate functions listed in this topic.]

      No other solution?

      Well GetSystemTimes is a good function if you have the Requirements

      Client         Requires Windows XP SP1. 
      Server         Requires Windows Server 2003. 
      Header         Declared in Winbase.h; include Windows.h.
      Library        Link to Kernel32.lib.
      DLL            Requires Kernel32.dll. 
      

      How to use it?

      Call this :

      FILETIME idleTime;
      FILETIME kernelTime;
      FILETIME userTime;
      BOOL res = GetSystemTimes( &idleTime, &kernelTime, &userTime );
      

      and voilà you have almost what you need.

      Now you have to poll this function and make a little calculus.

      usr = userTime - last_userTime;
      ker = kernelTime - last_kernelTime;
      idl = idleTime - last_idleTime;

      System time is:

      sys = kerl + usr

      idleTime is the rest because "System Idle" process is taking 100 % of CPU.

      So CPU is :

      cpu = int( (sys - idl) *100 / sys );

      Conclusion

      It was a very long wait before Microsoft gave us this function. Now it's done but there is still one problem. For multiple processor system, you don't have the right information.

      In the sample you can find the use of GetSystemTimes and GetProcessTimes and a little class to do everything.

      class CPU
      {
      public:
        CPU( void );
        ~CPU( void );
      
        // return :
        // % of cpu usage for this process 
        // % cpu systemUsage 
        // uptime for this process
        int GetUsage( int* pSystemUsage, TKTime* pUpTime );
    • License

      This article, along with any associated source code and files, is licensed under A Public Domain dedication

      Share

      About the Author

      ejor
      Web Developer
      United Kingdom United Kingdom
      http://dev.jesover.net

      Comments and Discussions

       
      Questionhow to compile? Pin
      Mojtaba Setoodeh10-Sep-13 1:10
      memberMojtaba Setoodeh10-Sep-13 1:10 
      AnswerRe: how to compile? Pin
      ejor10-Sep-13 2:53
      memberejor10-Sep-13 2:53 
      GeneralRe: how to compile? Pin
      Mojtaba Setoodeh10-Sep-13 19:53
      memberMojtaba Setoodeh10-Sep-13 19:53 
      GeneralRe: how to compile? Pin
      ejor10-Sep-13 20:49
      memberejor10-Sep-13 20:49 
      GeneralRe: how to compile? Pin
      Mojtaba Setoodeh11-Sep-13 0:19
      memberMojtaba Setoodeh11-Sep-13 0:19 
      QuestionWhen I use this function, I encountered an error that this function is undeclared, do you know why? Pin
      love_fairytale13-Mar-12 23:12
      memberlove_fairytale13-Mar-12 23:12 
      AnswerRe: When I use this function, I encountered an error that this function is undeclared, do you know why? Pin
      ejor20-Mar-12 4:13
      memberejor20-Mar-12 4:13 
      Generalapplication usage Pin
      john56324-Mar-10 2:01
      memberjohn56324-Mar-10 2:01 
      QuestionHow to get CPU Usage for a particular process?? Pin
      sanjibmail2-Jan-09 12:20
      membersanjibmail2-Jan-09 12:20 
      GeneralThe way it's supposed to be... Pin
      Vitaly Tomilov2-Sep-08 6:53
      memberVitaly Tomilov2-Sep-08 6:53 
      GeneralRe: The way it's supposed to be... [modified] Pin
      ejor2-Sep-08 9:40
      memberejor2-Sep-08 9:40 
      GeneralRe: The way it's supposed to be... Pin
      Vitaly Tomilov2-Sep-08 9:44
      memberVitaly Tomilov2-Sep-08 9:44 
      GeneralRe: The way it's supposed to be... Pin
      ejor2-Sep-08 10:06
      memberejor2-Sep-08 10:06 
      GeneralRe: The way it's supposed to be... Pin
      Vitaly Tomilov2-Sep-08 10:13
      memberVitaly Tomilov2-Sep-08 10:13 
      GeneralRe: The way it's supposed to be... Pin
      ejor2-Sep-08 10:19
      memberejor2-Sep-08 10:19 
      GeneralRe: The way it's supposed to be... Pin
      Vitaly Tomilov2-Sep-08 10:23
      memberVitaly Tomilov2-Sep-08 10:23 
      GeneralRe: The way it's supposed to be... Pin
      Member 41446493-Dec-08 3:28
      memberMember 41446493-Dec-08 3:28 
      GeneralRe: The way it's supposed to be... Pin
      Vitaly Tomilov3-Dec-08 3:41
      memberVitaly Tomilov3-Dec-08 3:41 
      AnswerRe: The way it's supposed to be... Pin
      Mr Scotty18-Nov-09 23:43
      memberMr Scotty18-Nov-09 23:43 
      GeneralRe: The way it's supposed to be... Pin
      Member 442588919-Mar-10 11:39
      memberMember 442588919-Mar-10 11:39 
      sorry to awaken this dead beast but i am having trouble compiling either pices of code, both the code in the article and the code provided by Vitaly Tomilov.
      when i try to compile the code from article it gives me the following error:
      \microsoft sdks\windows\v6.0a\include\sdkddkver.h(200) : fatal error C1012: unmatched parenthesis : missing ')'

      and when i try to compile the code given by by Vitaly Tomilov it gives me the following error:
      ..\ProcessorUsage.cpp|89|error: `CCritSecLock' was not declared in this scope|

      I would be most great full for any help!
      GeneralRe: The way it's supposed to be... Pin
      Vitaly Tomilov19-Mar-10 12:09
      memberVitaly Tomilov19-Mar-10 12:09 
      GeneralRe: The way it's supposed to be... Pin
      dxj1983102921-Jul-10 19:45
      memberdxj1983102921-Jul-10 19:45 
      GeneralGood coding practices Pin
      Abbas Ibn Fernas24-Mar-10 0:46
      memberAbbas Ibn Fernas24-Mar-10 0:46 
      GeneralRe: The way it's supposed to be... Pin
      Vider20-Dec-11 2:29
      memberVider20-Dec-11 2:29 
      GeneralRe: The way it's supposed to be... Pin
      Dan Bloomquist29-May-13 17:56
      memberDan Bloomquist29-May-13 17:56 

      General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

      Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

      | Advertise | Privacy | Terms of Use | Mobile
      Web03 | 2.8.150428.2 | Last Updated 20 Dec 2004
      Article Copyright 2004 by ejor
      Everything else Copyright © CodeProject, 1999-2015
      Layout: fixed | fluid