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

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

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

  1. // CpuRate.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <Windows.h>
  6. #include <cstdio>
  7. #include <conio.h>
  8.  
  9. class CCPUUseRate
  10. {
  11. public:
  12. BOOL Initialize()
  13. {
  14. FILETIME ftIdle, ftKernel, ftUser;
  15. BOOL flag = FALSE;
  16. if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
  17. {
  18. m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
  19. m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
  20. m_fOldCPUUserTime = FileTimeToDouble(ftUser);
  21.  
  22. }
  23. return flag;
  24. }
  25. //调用Initialize后要等待1左右秒再调用此函数
  26. int GetCPUUseRate()
  27. {
  28. int nCPUUseRate = -1;
  29. FILETIME ftIdle, ftKernel, ftUser;
  30. if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
  31. {
  32. double fCPUIdleTime = FileTimeToDouble(ftIdle);
  33. double fCPUKernelTime = FileTimeToDouble(ftKernel);
  34. double fCPUUserTime = FileTimeToDouble(ftUser);
  35. nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)
  36. / (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)
  37. *100.0);
  38. m_fOldCPUIdleTime = fCPUIdleTime;
  39. m_fOldCPUKernelTime = fCPUKernelTime;
  40. m_fOldCPUUserTime = fCPUUserTime;
  41. }
  42. return nCPUUseRate;
  43. }
  44. private:
  45. double FileTimeToDouble(FILETIME &filetime)
  46. {
  47. return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
  48. }
  49. private:
  50. double m_fOldCPUIdleTime;
  51. double m_fOldCPUKernelTime;
  52. double m_fOldCPUUserTime;
  53. };
  54.  
  55. int main()
  56. {
  57. do
  58. {
  59. CCPUUseRate cpuUseRate;
  60. if (!cpuUseRate.Initialize())
  61. {
  62. printf("WorkThread :初始化系统使用时间失败,错误码%d", GetLastError());
  63. break;
  64. }
  65.  
  66. while (true)
  67. {
  68. Sleep(1000);
  69. int liCpuUserRate = cpuUseRate.GetCPUUseRate();
  70. printf("\r当前CPU使用率为:%4d%%", liCpuUserRate);
  71. }
  72.  
  73. } while (false);
  74.  
  75. return 0;
  76. }

CPU使用率计算的更多相关文章

  1. java程序中线程cpu使用率计算

    原文地址:https://www.imooc.com/article/27374 最近确实遇到题目上的刚需,也是花了一段时间来思考这个问题. cpu使用率如何计算 计算使用率在上学那会就经常算,不过往 ...

  2. RT-Thread的CPU使用率计算

    CPU 的使用率一般是我们比较关心的问题,在这里我们就用空闲线程的钩子函数去统计 CPU 的使用率,并通过串口打印出来.首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“ ...

  3. Linux平台Cpu使用率的计算

    proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的 ...

  4. 在linux系统中实现各项监控的关键技术(1)--cpu使用率的计算

    转载自 Linux中通过/proc/stat等文件计算Cpu使用率 http://www.blogjava.net/fjzag/articles/317773.html proc文件系统 /proc文 ...

  5. Linux中通过/proc/stat等文件计算Cpu使用率

    Linux平台Cpu使用率的计算 proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/pro ...

  6. CPU使用率原理及计算方式

    本文转载自CPU使用率原理及计算方式 CPU:超线程和多核 超线程(Hyper-Threading ) 超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上.单个采用超线程的C ...

  7. 查看线程linux cpu使用率

    Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 p ...

  8. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

  9. 一文秒懂CPU使用率

    目录 CPU:Cores, and Hyper-Threading  超线程(Hyper-Threading ) 多核(multi-cores) CPU使用率计算 CPU使用率测试 如何计算CPU使用 ...

随机推荐

  1. linux 下各errno的意义

    strerror(errno):获取errno对应的错误 #include <string.h> /* for strerror */ #include <errno.h> # ...

  2. Android(java)学习笔记226:服务(service)之为什么使用服务

    1.服务 service 长期在后台运行的进程,一般没有应用程序界面   2.进程线程和应用程序之间的关系 应用程序开启,系统启动一个Linux进程,所有的组件都是运行在同一个进程的同一个线程(mai ...

  3. State 状态模式

    简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象 ...

  4. AlertDialog dismiss 和 cancel方法的区别

    AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同? AlertDialog继承与Dialog,现在各位看看结构图: 然后在Dialog类中找到了 ...

  5. 转载:C#中事件和委托的编译代码

    接上文转载:C#中事件的由来,这时候,我们注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误: public event Gr ...

  6. 各种开发语言示例调用WebService接口

    ASP示例: <% uid="账号"pwd="密码"tos="13900041123"msg="你们好"url = ...

  7. Word查找和替换通配符(完全版)

    Word查找栏代码·通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# 任意数字(单 ...

  8. ASP.NET数据报表之柱状图 ------工作日志

    #region 柱形色调 /// <summary> /// 柱形色调 /// </summary> private string[] myColor = new string ...

  9. gir配置

    Git配置 1. 用户信息 你个人的用户名称和电子邮件地址,用户名可随意修改,git 用于记录是谁提交了更新,以及更新人的联系方式. $ git config --global user.name & ...

  10. 自定义鼠标Cursor转变成图片

    今天无意做到项目遇到一个好玩的事情,就是当我鼠标移到一个链接上面,并不是像正常那样出现一个小手,而是变成一个小十字架, 下面看图当时第一眼看到总感觉哪里不对,噢噢噢噢 这样的 小手没了,居然是一个图片 ...