1、获取系统cpu:
使用WindowsAPI函数GetSystemTimes(),为获取当前使用率,通过执行两次的方式进行差值比较。在win7,win10上试验结果准确,具体用法参考下列代码:
//Windows程序获取cpu占用率
void GetCpuUsage_WIN(double* CPUResult) {
CPUResult[0] = 0;
CPUResult[1] = 0;
FILETIME ftIdle, ftKernel, ftUser;
//GetSystemTimes()获取系统CPU空闲时间、内核时间、用户时间
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser)) {
m_fOldCPUIdleTime = FileTimeToDouble(&ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(&ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(&ftUser);
//printf("自开机来的平均CPU占用率:%2.f%%", 100 * (1 - (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime)));
//printf(" %2.f%%\n", 100 * (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime));
}
Sleep(1000);
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser)) {
m_fOldCPUIdleTime = FileTimeToDouble(&ftIdle) - m_fOldCPUIdleTime;
m_fOldCPUKernelTime = FileTimeToDouble(&ftKernel) - m_fOldCPUKernelTime;
m_fOldCPUUserTime = FileTimeToDouble(&ftUser) - m_fOldCPUUserTime;
}
/*
*计算cpu占用率,注意内核时间中包含空闲时间,空闲时间为cpu空转时间
*运行时间=用户时间+内核时间-空闲时间
*间隔时间=用户时间+内核时间
*cpu占用率=运行时间/间隔时间,cpu闲置率=空闲时间/间隔时间
*/
*CPUResult++ = 100 * (1 - (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime));
*CPUResult = (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime) * 100;
CPUResult--;
}
win7比较如下:
2、获取进程CPU:
在最开始选择了使用GetProcessTimes()函数实现,发现其返回值中仅包含了内核时间以及用户时间,即使求取了差值也不清楚分母的大小,故在试验中使用GetSystemTimes()计算总时间。各位看官如可以采取更好的方式实现,可以在下发留言以供其他同学参考。
实现代码如下,win7、win10下与任务管理器结果一致,需注意,代码粗暴,自行优美:
//Windows执行cmd指令
bool Wincmd(char* cmd, char* result)
{
char buffer[128];//缓冲区
FILE* pipe = _popen(cmd, "r");//_popen函数创建管道调用fork产生子进程,以执行cmd指令,这个进程需以_pclose关闭
if (!pipe) {
_pclose(pipe);
return false;
}
while (!feof(pipe)) { //feof判断流、文件是否读完
if (fgets(buffer, 128, pipe)) {
strcat_s(result, 1024, buffer);
if (strlen(result) > 896) {
break;
}
}
}
_pclose(pipe);
return true;
}
//判断进程是否存在
bool IsProExit(int ID) {
char str[128] = "tasklist /FI \"PID eq ";
char strPID[24] = { '\0' };
char* strbuf = NULL;
char* tmpstr = NULL;
_itoa_s(ID, strPID, 24, 10);
strcat_s(str, strPID);
strcat_s(str, "\"\n");
Wincmd(str, result);
if (!strstr(result, "PID")) {
return false;
}
//获取PID进程名称
strtok_s(result, "\n", &strbuf);
strtok_s(strbuf, "\n
1、获取系统cpu:
使用WindowsAPI函数GetSystemTimes(),为获取当前使用率,通过执行两次的方式进行差值比较。在win7,win10上试验结果准确,具体用法参考下列代码:
//Windows程序获取cpu占用率
void GetCpuUsage_WIN(double* CPUResult) {
CPUResult[0] = 0;
CPUResult[1] = 0;
FILETIME ftIdle, ftKernel, ftUser;
//GetSystemTimes()获取系统CPU空闲时间、内核时间、用户时间
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser)) {
m_fOldCPUIdleTime = FileTimeToDouble(&ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(&ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(&ftUser);
//printf("自开机来的平均CPU占用率:%2.f%%", 100 * (1 - (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime)));
//printf(" %2.f%%\n", 100 * (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime));
}
Sleep(1000);
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser)) {
m_fOldCPUIdleTime = FileTimeToDouble(&ftIdle) - m_fOldCPUIdleTime;
m_fOldCPUKernelTime = FileTimeToDouble(&ftKernel) - m_fOldCPUKernelTime;
m_fOldCPUUserTime = FileTimeToDouble(&ftUser) - m_fOldCPUUserTime;
}
/*
*计算cpu占用率,注意内核时间中包含空闲时间,空闲时间为cpu空转时间
*运行时间=用户时间+内核时间-空闲时间
*间隔时间=用户时间+内核时间
*cpu占用率=运行时间/间隔时间,cpu闲置率=空闲时间/间隔时间
*/
*CPUResult++ = 100 * (1 - (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime));
*CPUResult = (m_fOldCPUIdleTime) / (m_fOldCPUKernelTime + m_fOldCPUUserTime) * 100;
CPUResult--;
}
win7比较如下:
2、获取进程CPU:
在最开始选择了使用GetProcessTimes()函数实现,发现其返回值中仅包含了内核时间以及用户时间,即使求取了差值也不清楚分母的大小,故在试验中使用GetSystemTimes()计算总时间。各位看官如可以采取更好的方式实现,可以在下发留言以供其他同学参考。
实现代码如下,win7、win10下与任务管理器结果一致,需注意,代码粗暴,自行优美:
//Windows执行cmd指令
bool Wincmd(char* cmd, char* result)
{
char buffer[128];//缓冲区
FILE* pipe = _popen(cmd, "r");//_popen函数创建管道调用fork产生子进程,以执行cmd指令,这个进程需以_pclose关闭
if (!pipe) {
_pclose(pipe);
return false;
}
while (!feof(pipe)) { //feof判断流、文件是否读完
if (fgets(buffer, 128, pipe)) {
strcat_s(result, 1024, buffer);
if (strlen(result) > 896) {
break;
}
}
}
_pclose(pipe);
return true;
}
//判断进程是否存在
bool IsProExit(int ID) {
char str[128] = "tasklist /FI \"PID eq ";
char strPID[24] = { '\0' };
char* strbuf = NULL;
char* tmpstr = NULL;
_itoa_s(ID, strPID, 24, 10);
strcat_s(str, strPID);
strcat_s(str, "\"\n");
Wincmd(str, result);
if (!strstr(result, "PID")) {
return false;
}
//获取PID进程名称
strtok_s(result, "\n", &strbuf);
strtok_s(strbuf, "\n