Windows获取系统、进程CPU占用率、内存、磁盘、网卡 | 您所在的位置:网站首页 › Win10用户配置文件进程占用内存 › Windows获取系统、进程CPU占用率、内存、磁盘、网卡 |
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进程名称 strto |
CopyRight 2018-2019 实验室设备网 版权所有 |