Windows获取系统、进程CPU占用率、内存、磁盘、网卡 您所在的位置:网站首页 Win10用户配置文件进程占用内存 Windows获取系统、进程CPU占用率、内存、磁盘、网卡

Windows获取系统、进程CPU占用率、内存、磁盘、网卡

2024-06-12 17:00| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有