zoukankan      html  css  js  c++  java
  • CPU使用率计算

    昨天接到临时任务,需要将一个工作线程执行真正工作的时机推迟到CPU空闲时执行。当时第一感觉认为是将线程优先级设置为空闲级别就行了,以为只有CPU空闲下来才会去跑这个线程,实际上应该不是,毕竟即时是空闲级别也需要排入队列,只不过优先级低而已。当然其实也不能说CPU空闲时来执行,应该说使用率比较低的时候来执行比较合适。

    参考博客:http://www.cnblogs.com/TenosDoIt/p/3242910.html,描述了比较多的方法来介绍如何计算CPU使用率。

    我尝试了两种方式,使用VS的pdh来计算好像不是很准,但是使用GetSystemTimers来计算基本和任务管理器中显示的很接近了,这里接下这段代码:

    // CpuRate.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    #include <cstdio>
    #include <conio.h>
    
    class CCPUUseRate
    {
    public:
        BOOL Initialize() 
        {
            FILETIME ftIdle, ftKernel, ftUser;
            BOOL flag = FALSE;
            if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
            {
                m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
                m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
                m_fOldCPUUserTime = FileTimeToDouble(ftUser);
    
            }
            return flag;
        }
        //调用Initialize后要等待1左右秒再调用此函数
        int GetCPUUseRate()
        {
            int nCPUUseRate = -1;
            FILETIME ftIdle, ftKernel, ftUser;
            if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
            {
                double fCPUIdleTime = FileTimeToDouble(ftIdle);
                double fCPUKernelTime = FileTimeToDouble(ftKernel);
                double fCPUUserTime = FileTimeToDouble(ftUser);
                nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime) 
                    / (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime) 
                    *100.0);
                m_fOldCPUIdleTime = fCPUIdleTime;
                m_fOldCPUKernelTime = fCPUKernelTime;
                m_fOldCPUUserTime = fCPUUserTime;
            }
            return nCPUUseRate;
        }
    private:
        double FileTimeToDouble(FILETIME &filetime)
        {
            return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
        }
    private:
        double m_fOldCPUIdleTime;
        double m_fOldCPUKernelTime;
        double m_fOldCPUUserTime;
    };
    
    int main()
    {
        do 
        {
            CCPUUseRate cpuUseRate;
            if (!cpuUseRate.Initialize())
            {
                printf("WorkThread :初始化系统使用时间失败,错误码%d", GetLastError());
                break;
            }
    
            while (true)
            {    
                Sleep(1000);
                int liCpuUserRate = cpuUseRate.GetCPUUseRate();
                printf("
    当前CPU使用率为:%4d%%", liCpuUserRate);
            }
    
        } while (false);
    
        return 0;
    }
  • 相关阅读:
    python 中 time 模块 格式化 format
    python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
    Quick-lua3.3之listview
    健身计划表
    quick-cocos2d-x 实现在lua里面完成android支付宝的接入
    lua table 排序--满足多条件排序
    lua 操作中文字符串之截取和长度竖排显示
    ClippingNode实现新手引导高亮裁切
    quick cocos2dx lua 内存释放
    cocos2d-x的lua脚本加载CocostudioUI两种方式
  • 原文地址:https://www.cnblogs.com/monotone/p/4241893.html
Copyright © 2011-2022 走看看