admin管理员组

文章数量:1591205

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

本文标签: 磁盘网卡进程内存占用率