Click here to Skip to main content
13,248,927 members (43,679 online)
Click here to Skip to main content
Add your own
alternative version


58 bookmarked
Posted 20 Dec 2004

Get CPU Usage with GetSystemTimes

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


      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:

        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 );


      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
        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


      About the Author

      Web Developer
      United Kingdom United Kingdom

      You may also be interested in...

      Comments and Discussions

      GeneralRe: The way it's supposed to be... Pin
      Dan Bloomquist29-May-13 17:56
      memberDan Bloomquist29-May-13 17:56 
      GeneralMessy Pin
      Vitaly Tomilov2-Sep-08 6:44
      memberVitaly Tomilov2-Sep-08 6:44 
      GeneralNice! Pin
      Vitaly Tomilov23-Aug-08 8:15
      memberVitaly Tomilov23-Aug-08 8:15 
      GeneralRe: Nice! Pin
      ejor23-Aug-08 9:27
      memberejor23-Aug-08 9:27 
      GeneralRe: Nice! Pin
      Vitaly Tomilov23-Aug-08 9:38
      memberVitaly Tomilov23-Aug-08 9:38 
      GeneralDoesn't compile... Pin
      Paul Conrad9-Dec-07 13:31
      memberPaul Conrad9-Dec-07 13:31 
      GeneralCurrent Process % cpu utilisation Pin
      kintz6-Jul-06 5:10
      memberkintz6-Jul-06 5:10 
      AnswerRe: Current Process % cpu utilisation Pin
      ejor29-Oct-06 11:06
      memberejor29-Oct-06 11:06 
      QuestionCode bug? Pin
      kintz6-Jul-06 0:24
      memberkintz6-Jul-06 0:24 
      AnswerRe: Code bug? Pin
      ejor6-Jul-06 2:31
      memberejor6-Jul-06 2:31 
      Generalmultiple processor Pin
      hxtking6-Apr-06 11:45
      memberhxtking6-Apr-06 11:45 
      GeneralRe: multiple processor Pin
      ejor6-Apr-06 12:02
      memberejor6-Apr-06 12:02 
      Questionhow about cygwin ? Pin
      personalcomputer25-Feb-06 0:23
      memberpersonalcomputer25-Feb-06 0:23 
      AnswerRe: how about cygwin ? Pin
      ejor26-Feb-06 0:29
      memberejor26-Feb-06 0:29 
      QuestionWhy is "System Idle" process 100% of CPU? Pin
      dmtwpi2120-Jan-06 10:59
      memberdmtwpi2120-Jan-06 10:59 
      AnswerRe: Why is "System Idle" process 100% of CPU? Pin
      ejor20-Jan-06 11:04
      memberejor20-Jan-06 11:04 
      GeneralWindows CE support Pin
      ronannaughton25-Oct-05 15:18
      memberronannaughton25-Oct-05 15:18 
      GeneralRe: Windows CE support Pin
      Shanmuga Sundar.V8-May-08 4:57
      memberShanmuga Sundar.V8-May-08 4:57 
      Generalremote computers Pin
      PeterK200325-Aug-05 10:11
      memberPeterK200325-Aug-05 10:11 
      GeneralRe: remote computers Pin
      ejor25-Aug-05 10:21
      memberejor25-Aug-05 10:21 
      Generalwhen to get last times Pin
      ferhatmantar9-Aug-05 1:00
      memberferhatmantar9-Aug-05 1:00 
      GeneralRe: when to get last times Pin
      ejor9-Aug-05 3:23
      memberejor9-Aug-05 3:23 
      QuestionGreat! do you know function like those used in your class for memory monitoring ? Pin
      mamelouk10-Jun-05 5:15
      membermamelouk10-Jun-05 5:15 
      GeneralIt's good, and TaskManager uses a look like method Pin
      Strom_DCASM20-Feb-05 5:50
      sussStrom_DCASM20-Feb-05 5:50 
      GeneralI think its not working on my pc !! Pin
      sandeepsulakhe13-Feb-05 19:48
      membersandeepsulakhe13-Feb-05 19:48 
      GeneralRe: I think its not working on my pc !! Pin
      sandeepsulakhe14-Feb-05 1:49
      membersandeepsulakhe14-Feb-05 1:49 
      GeneralRe: I think its not working on my pc !! Pin
      ejor16-Feb-05 3:04
      memberejor16-Feb-05 3:04 
      QuestionIt can not perform very well in winXp withou sp1? Pin
      BOOM21-Dec-04 1:04
      memberBOOM21-Dec-04 1:04 
      AnswerRe: It can not perform very well in winXp withou sp1? Pin
      ejor21-Dec-04 4:03
      memberejor21-Dec-04 4:03 
      GeneralRe: It can not perform very well in winXp without sp1? Pin
      BOOM23-Dec-04 14:31
      memberBOOM23-Dec-04 14:31 
      GeneralI wouldn't use this function Pin
      Jörgen Sigvardsson20-Dec-04 9:49
      memberJörgen Sigvardsson20-Dec-04 9:49 
      GeneralRe: I wouldn't use this function Pin
      ejor20-Dec-04 9:56
      memberejor20-Dec-04 9:56 
      GeneralRe: I wouldn't use this function Pin
      Jörgen Sigvardsson20-Dec-04 9:59
      memberJörgen Sigvardsson20-Dec-04 9:59 

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

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

      Permalink | Advertise | Privacy | Terms of Use | Mobile
      Web04 | 2.8.171114.1 | Last Updated 20 Dec 2004
      Article Copyright 2004 by ejor
      Everything else Copyright © CodeProject, 1999-2017
      Layout: fixed | fluid