Click here to Skip to main content
15,886,046 members
Articles / Programming Languages / C++

Get CPU Usage with GetSystemTimes

Rate me:
Please Sign up or sign in to vote.
4.27/5 (26 votes)
20 Dec 2004Public Domain1 min read 349.3K   7.4K   59   59
How to get CPU usage with GetSystemTimes
In this article, you will find a solution for getting CPU usage with the help of GetSystemTimes.

Introduction

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

You've a lot of ways 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 );

History

  • 20th December, 2004: Initial version

License

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


Written By
Web Developer
United Kingdom United Kingdom
http://dev.jesover.net

Comments and Discussions

 
GeneralGood coding practices Pin
Youssef-Gamal-523-Mar-10 23:46
Youssef-Gamal-523-Mar-10 23:46 
GeneralRe: The way it's supposed to be... Pin
Vider20-Dec-11 1:29
Vider20-Dec-11 1:29 
GeneralRe: The way it's supposed to be... Pin
Dan Bloomquist29-May-13 16:56
Dan Bloomquist29-May-13 16:56 
GeneralMessy Pin
Vitaly Tomilov2-Sep-08 5:44
Vitaly Tomilov2-Sep-08 5:44 
GeneralNice! Pin
Vitaly Tomilov23-Aug-08 7:15
Vitaly Tomilov23-Aug-08 7:15 
GeneralRe: Nice! Pin
ejor23-Aug-08 8:27
ejor23-Aug-08 8:27 
GeneralRe: Nice! Pin
Vitaly Tomilov23-Aug-08 8:38
Vitaly Tomilov23-Aug-08 8:38 
GeneralDoesn't compile... Pin
Paul Conrad9-Dec-07 12:31
professionalPaul Conrad9-Dec-07 12:31 
The source code does not compile. Complains of a mismatched ) in one of the header files.

"The clue train passed his station without stopping." - John Simmons / outlaw programmer

"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon


GeneralCurrent Process % cpu utilisation Pin
kintz6-Jul-06 4:10
kintz6-Jul-06 4:10 
AnswerRe: Current Process % cpu utilisation Pin
ejor29-Oct-06 10:06
ejor29-Oct-06 10:06 
QuestionCode bug? Pin
kintz5-Jul-06 23:24
kintz5-Jul-06 23:24 
AnswerRe: Code bug? Pin
ejor6-Jul-06 1:31
ejor6-Jul-06 1:31 
Generalmultiple processor Pin
hxtking6-Apr-06 10:45
hxtking6-Apr-06 10:45 
GeneralRe: multiple processor Pin
ejor6-Apr-06 11:02
ejor6-Apr-06 11:02 
Questionhow about cygwin ? Pin
personalcomputer24-Feb-06 23:23
personalcomputer24-Feb-06 23:23 
AnswerRe: how about cygwin ? Pin
ejor25-Feb-06 23:29
ejor25-Feb-06 23:29 
QuestionWhy is "System Idle" process 100% of CPU? Pin
dmtwpi2120-Jan-06 9:59
dmtwpi2120-Jan-06 9:59 
AnswerRe: Why is "System Idle" process 100% of CPU? Pin
ejor20-Jan-06 10:04
ejor20-Jan-06 10:04 
GeneralWindows CE support Pin
ronannaughton25-Oct-05 14:18
ronannaughton25-Oct-05 14:18 
GeneralRe: Windows CE support Pin
Shanmuga Sundar.V8-May-08 3:57
Shanmuga Sundar.V8-May-08 3:57 
Generalremote computers Pin
PeterK200325-Aug-05 9:11
PeterK200325-Aug-05 9:11 
GeneralRe: remote computers Pin
ejor25-Aug-05 9:21
ejor25-Aug-05 9:21 
Generalwhen to get last times Pin
ferhatmantar9-Aug-05 0:00
ferhatmantar9-Aug-05 0:00 
GeneralRe: when to get last times Pin
ejor9-Aug-05 2:23
ejor9-Aug-05 2:23 
QuestionGreat! do you know function like those used in your class for memory monitoring ? Pin
mamelouk10-Jun-05 4:15
mamelouk10-Jun-05 4:15 

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.