MFC如何获取系统CPU使用率API

  • 原创
  • |
  • 浏览:2039
  • |
  • 更新:

介绍一下利用 windows的API GetSystemTimes()获取系统时钟,计算cpu的利用率的方法,具体思路是使用计算公式获取cpu

(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率   

工具/原料

  • VC
  • MSDN

方法/步骤

  1. 1

    1、通过查阅msdn,可以知道GetSystemTimes函数可以获取系统的时间,可以获得系统(自开机以来)处于Kernel状态下面的CPU时间,以及系统处于User状态下的时间,以及Idle的时间.我们只用Kernel时间和User时间, 不用Idle时间.

    MFC如何获取系统CPU使用率API
  2. 2

    2、通过计算公式来计算

    (总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率   

    这个应该容易理解,利用率就是有效的使用时间在全部时间中的占比

    MFC如何获取系统CPU使用率API
  3. 2
    本页面未经许可获取自百度经验
  4. 3

    3、简单写个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;

    }

    MFC如何获取系统CPU使用率API
  5. 4

    4、运行程序,对比任务管理器的cpu使用率,发现是一样的,可以参考以上代码把这功能代码封装成一个功能函数,方便调用

    MFC如何获取系统CPU使用率API
  6. 5

    5、接下来,进一步对代码进行优化,将获取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;

    }

    MFC如何获取系统CPU使用率API
  7. 6

    6、上面的写法其实还有一个缺点,就是获取的时候需要延时一秒,这个对直接调用不太好,可以使用线程或者定时器和加锁保护读写同步来代替,参考代码如下

    #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;

    }

    CRITICAL_SECTION slock;

    double     scpuuse = 0;

    void SetCpuUsage(double cpu)

    {

    EnterCriticalSection(&slock);

    scpuuse = cpu;

    LeaveCriticalSection(&slock);

    }

    double GetCpuUsage()

    {

    double cpu = 0;

    EnterCriticalSection(&slock);

    cpu = scpuuse;

    LeaveCriticalSection(&slock);

    return cpu;

    }

    DWORD WINAPI   ThreadProc(LPVOID lpParam)

    {

    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)

    SetCpuUsage(0.0);

    else

    SetCpuUsage(abs((kernel + user - idle) * 100 / (kernel + user)));//(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率

    } while (1);

    }

    int main(int argc, char* argv[])

    {

    HANDLE m_hThread;

    InitializeCriticalSection(&slock);

    m_hThread = CreateThread(NULL, 0, ThreadProc, 0, 0, NULL);//创建新线程  

    do

    {

    printf("cpu useage: %01f!\n", GetCpuUsage());

    Sleep(1000);

    } while (1);

    CloseHandle(m_hThread);

    DeleteCriticalSection(&slock);

    return 0;

    }

    MFC如何获取系统CPU使用率API
    MFC如何获取系统CPU使用率API
    END

注意事项

  • 仅供学习参考
  • 如有错误请指正
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部