方法如下:
一、透過查閱msdn,可以知道GetSystemTimes函式可以獲取系統的時間,可以獲得系統(自開機以來)處於Kernel狀態下面的CPU時間,以及系統處於User狀態下的時間,以及Idle的時間.我們只用Kernel時間和User時間, 不用Idle時間。
二、透過計算公式來計算
(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率 。
三、簡單寫個demo測試下,程式碼如下
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <tchar.h>
__int64 DiffFileTime(FILETIME time1, FILETIME time2)
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
return b - a;
}
int main(int argc, char* argv[])
double cpuuse;
int idle, kernel, user;
FILETIME idleTime1, idleTime2;
FILETIME kernelTime1, kernelTime2;
FILETIME userTime1, userTime2;
do
GetSystemTimes(&idleTime1, &kernelTime1, &userTime1);
Sleep(1000);
GetSystemTimes(&idleTime2, &kernelTime2, &userTime2);
idle = (int)DiffFileTime(idleTime1, idleTime2);
kernel = (int)DiffFileTime(kernelTime1, kernelTime2);
user = (int)DiffFileTime(userTime1, userTime2);
if (kernel + user == 0)
cpuuse = 0.0;
else
cpuuse = abs((kernel + user - idle) * 100 / (kernel + user));//(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率
printf("cpu useage: %01f!\n", cpuuse);
} while (1);
return 0;
四、執行程式,對比任務管理器的cpu使用率,發現是一樣的,可以參考以上程式碼把這功能程式碼封裝成一個功能函式,方便呼叫。
五、接下來,進一步對程式碼進行最佳化,將獲取cpu的封裝成一個通用的介面,最佳化後代碼如下:
double GetCpuUsage()
return cpuuse;
double cpuusage = 0;
cpuusage = GetCpuUsage();
方法如下:
一、透過查閱msdn,可以知道GetSystemTimes函式可以獲取系統的時間,可以獲得系統(自開機以來)處於Kernel狀態下面的CPU時間,以及系統處於User狀態下的時間,以及Idle的時間.我們只用Kernel時間和User時間, 不用Idle時間。
二、透過計算公式來計算
(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率 。
三、簡單寫個demo測試下,程式碼如下
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <tchar.h>
__int64 DiffFileTime(FILETIME time1, FILETIME time2)
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
return b - a;
}
int main(int argc, char* argv[])
{
double cpuuse;
int idle, kernel, user;
FILETIME idleTime1, idleTime2;
FILETIME kernelTime1, kernelTime2;
FILETIME userTime1, userTime2;
do
{
GetSystemTimes(&idleTime1, &kernelTime1, &userTime1);
Sleep(1000);
GetSystemTimes(&idleTime2, &kernelTime2, &userTime2);
idle = (int)DiffFileTime(idleTime1, idleTime2);
kernel = (int)DiffFileTime(kernelTime1, kernelTime2);
user = (int)DiffFileTime(userTime1, userTime2);
if (kernel + user == 0)
cpuuse = 0.0;
else
cpuuse = abs((kernel + user - idle) * 100 / (kernel + user));//(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率
printf("cpu useage: %01f!\n", cpuuse);
} while (1);
return 0;
}
四、執行程式,對比任務管理器的cpu使用率,發現是一樣的,可以參考以上程式碼把這功能程式碼封裝成一個功能函式,方便呼叫。
五、接下來,進一步對程式碼進行最佳化,將獲取cpu的封裝成一個通用的介面,最佳化後代碼如下:
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <tchar.h>
__int64 DiffFileTime(FILETIME time1, FILETIME time2)
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
return b - a;
}
double GetCpuUsage()
{
double cpuuse;
int idle, kernel, user;
FILETIME idleTime1, idleTime2;
FILETIME kernelTime1, kernelTime2;
FILETIME userTime1, userTime2;
GetSystemTimes(&idleTime1, &kernelTime1, &userTime1);
Sleep(1000);
GetSystemTimes(&idleTime2, &kernelTime2, &userTime2);
idle = (int)DiffFileTime(idleTime1, idleTime2);
kernel = (int)DiffFileTime(kernelTime1, kernelTime2);
user = (int)DiffFileTime(userTime1, userTime2);
if (kernel + user == 0)
cpuuse = 0.0;
else
cpuuse = abs((kernel + user - idle) * 100 / (kernel + user));//(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率
return cpuuse;
}
int main(int argc, char* argv[])
{
double cpuusage = 0;
do
{
cpuusage = GetCpuUsage();
printf("cpu useage: %01f!\n", cpuuse);
} while (1);
return 0;
}