主要代码如下:

// test4.cpp : 定义控制台应用程序的入口点。
// 简单的监控指定程序列表的CPU使用率#include "stdafx.h"#include<thread>
#include <windows.h>
#include <stdint.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <Psapi.h>
#include <string>
#include <map>using namespace std;typedef struct EnumHWndsArg
{std::vector<HWND> *vecHWnds;DWORD dwProcessId;
}EnumHWndsArg, *LPEnumHWndsArg;HANDLE GetProcessHandleByID(int nID)//通过进程ID获取进程句柄
{return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}std::vector<DWORD> GetProcessIDByName(const char* pName)
{std::vector<DWORD> vPID;HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hSnapshot) {return vPID;}PROCESSENTRY32 pe = { sizeof(pe) };for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {if (strcmp(pe.szExeFile, pName) == 0) {vPID.push_back(pe.th32ProcessID);}}CloseHandle(hSnapshot);return vPID;
}BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{EnumHWndsArg *pArg = (LPEnumHWndsArg)lParam;DWORD  processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == pArg->dwProcessId){pArg->vecHWnds->push_back(hwnd);//printf("%p\n", hwnd);}return TRUE;
}void GetHWndsByProcessID(DWORD processID, std::vector<HWND> &vecHWnds)
{EnumHWndsArg wi;wi.dwProcessId = processID;wi.vecHWnds = &vecHWnds;EnumWindows(lpEnumFunc, (LPARAM)&wi);
}LONGLONG FileTime2UInt64(const _In_ FILETIME& ftTime)
{LARGE_INTEGER l_intger;l_intger.LowPart = ftTime.dwLowDateTime;l_intger.HighPart = ftTime.dwHighDateTime;return l_intger.QuadPart;
}std::map<LONGLONG, LONGLONG> gmapLastSysTime;
std::map<LONGLONG, LONGLONG> gmapLastNowTime;void ThreadTest()
{FILE* fpIn;fopen_s(&fpIn, "load.config", "r+");if (!fpIn)return;std::vector<std::string> vNameList;char aBuff[128];while (!feof(fpIn)){fgets(aBuff, sizeof(aBuff), fpIn);if (strlen(aBuff) > 1){if(aBuff[strlen(aBuff) - 1] == '\n')aBuff[strlen(aBuff) - 1] = '\0';vNameList.push_back(aBuff);}}fclose(fpIn);char aName[128];while (1){for (auto itName : vNameList){sprintf_s(aName, sizeof(aName), "%s.exe", itName.c_str());std::vector<DWORD> vPID = GetProcessIDByName(aName);for (auto it : vPID){std::string strOut;char strInfo[1024];DWORD pid = it;sprintf_s(strInfo, "\npid:%d\n", pid);strOut.append(strInfo);HANDLE handle = GetProcessHandleByID(static_cast<int>(pid));PROCESS_MEMORY_COUNTERS_EX pmc = { 0 };int a = sizeof(pmc);if (!GetProcessMemoryInfo(handle, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))){DWORD errCode = GetLastError();printf_s("GetProcessMemoryInfo fail, lastErrorCode:%d\n", errCode);return;}//占用的物理内存峰值sprintf_s(strInfo, "PeakWorkingSetSize:%d(KB)\n", pmc.PeakWorkingSetSize / 1024);strOut.append(strInfo);//当前占用的物理内存sprintf_s(strInfo, "WorkingSetSize:%d(KB)\n", pmc.WorkingSetSize / 1024);strOut.append(strInfo);//占用的虚拟内存峰值(物理内存+页文件),对应任务管理器中的commit列值sprintf_s(strInfo, "PeakPagefileUsage:%d(KB)\n", pmc.PeakPagefileUsage / 1024);strOut.append(strInfo);//当前占用的虚拟内存(物理内存+页文件),对应任务管理器中的commit列值sprintf_s(strInfo, "PagefileUsage:%d(KB)\n", pmc.PagefileUsage / 1024);strOut.append(strInfo);//等同于当前占用的虚拟内存(物理内存+页文件),对应任务管理器中的commit列值,并不是任务管理器中的私有独占内存的意思。sprintf_s(strInfo, "PrivateUsage:%d(KB)\n", pmc.PrivateUsage / 1024);strOut.append(strInfo);//printf("%s", strOut.c_str());FILETIME ftNow, ftCreate, ftExit, ftKernel, ftUser;SYSTEM_INFO info;GetSystemInfo(&info);GetSystemTimeAsFileTime(&ftNow);if (!GetProcessTimes(handle, &ftCreate, &ftExit, &ftKernel, &ftUser))return;LONGLONG llSys = (FileTime2UInt64(ftKernel) + FileTime2UInt64(ftUser)) / info.dwNumberOfProcessors;LONGLONG llNow = FileTime2UInt64(ftNow);if (gmapLastSysTime[pid] && gmapLastNowTime[pid]){LONGLONG llSysDelta = llSys - gmapLastSysTime[pid];LONGLONG llTimeDelta = llNow - gmapLastNowTime[pid];float fCpu = 100.0*(float)llSysDelta / (float)llTimeDelta;SYSTEMTIME tm;GetLocalTime(&tm);char aData[1024];sprintf_s(aData, sizeof(aData), "%u-%u-%u_%u:%u:%u cpu:%.2f - time:%lld\n", tm.wYear,tm.wMonth,tm.wDay,tm.wHour,tm.wMinute,tm.wSecond, fCpu, llTimeDelta);FILE* fpOut;char aFileName[256];sprintf_s(aFileName, sizeof(aFileName), "cpu\\%s_%d.log", aName, pid);fopen_s(&fpOut, aFileName, "a+");if(fpOut) {fputs(aData, fpOut);fflush(fpOut);fclose(fpOut);}else {printf_s("open[%s]failed\n", aFileName);}}gmapLastSysTime[pid] = llSys;gmapLastNowTime[pid] = llNow;}}Sleep(1000);//printf_s("\n\n====================\n");}
}int main()
{std::thread mythread(ThreadTest);mythread.join();return 0;
}

配置文件 load.config:根据实际需要进行配置,比如WeChat.exe GameServer.exe WebServer.exe

WeChat
GameServer
WebServer

输出到 cpu\xxxxx.log,形式如下

2020-5-25_18:0:14 cpu:0.00 - time:10781641
2020-5-25_18:0:15 cpu:0.00 - time:10468579
2020-5-25_18:0:16 cpu:0.72 - time:10781368
2020-5-25_18:0:17 cpu:0.00 - time:10469099
2020-5-25_18:0:18 cpu:0.00 - time:10781901

C++ 简单的CPU使用率监控程序相关推荐

  1. CPU使用率过高的原因及解决方法

    常见的CPU使用率过高可不是职场CPU哦,而是电脑的中央处理器,CPU作为计算机系统重要的运算和控制核心,可谓是"很忙"的存在.在我们日常使用电脑设备时,由于打开的软件.游戏.网页 ...

  2. Linux 系统 CPU 使用率简单分析

    CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示. CPU 使用率 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 ...

  3. WPF 动态模拟CPU 使用率曲线图

    在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改,则手动创建图形可能会变得枯燥乏味.本篇将利用Dynam ...

  4. Linux系统的CPU使用率和Load

    为什么80%的码农都做不了架构师?>>>    好吧,我承认这个话题是老生常谈,我自己也在2009年刚接触性能测试时就已经开始关注并略知一二:然而,对于CPU使用率和系统负载Load ...

  5. 查看cpu使用率_腾讯游戏开发工程师:Linux 机器 CPU 毛刺问题排查

    作者:jasonzxpan,腾讯 IEG 运营开发工程师 本文排查一个Linux 机器 CPU 毛刺问题,排查过程中不变更进程状态.也不会影响线上服务,最后还对 CPU 毛刺带来的风险进行了分析和验证 ...

  6. linux查看docker使用率,Linux系统非Docker环境如何限制CPU使用率

    微服务时代,有时候为了方便,经常在一台高配置服务器运行很多服务,这个时候CPU资源抢占就成了一个非常头痛的问题.闲时不会出现什么问题,比如一台16核服务器,当某一个时刻某个微服出现高并发访问时,此服务 ...

  7. 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...

    我们都知道,CPU也就是中央处理器,可以说它是电脑的核心部分,相当于人们心脏对于身体的作用,可见其重要性.对于CPU来说,主要是帮助我们的电脑进行处理.运算以及控制数据.而说到与之相关的CPU使用率, ...

  8. 宝塔面板网站一打开cpu百分百_BT宝塔面板打开这个功能网站快到起飞,降低宝塔面板内存和CPU使用率,降低运行负载...

    最近一段时间网站经常出现链接数据库错误,当然原因很简单,卡着了.查看宝塔面板发现负载状态经常是100%,内存使用率也是100%,CPU也不用说了,所以在网上查找了一些关于降低宝塔面板服务器内存和CPU ...

  9. 10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?

    上一期我给你讲了软中断的基本原理,我们先来简单复习下. 中断是一种异步的事件处理机制,用来提高系统的并发处理能力.中断事件发生,会触发执行中断处理程序,而中断处理程序被分为上半部和下半部这两个部分. ...

最新文章

  1. idea本地跑如何看gc日志_牛逼了!用 IDEA 扒出了开源组件导致FGC的原因
  2. 什么是 MIME Type
  3. How to debug Material delta download
  4. 三星android rom开发者,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布
  5. 接口测试工具-Jmeter使用笔记(九:跨线程组传递变量)
  6. DAY3 scp,rsync,chmod,chown,setfacl
  7. 【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器
  8. Flutter初步-第一个电视直播APP
  9. 图片压缩,分辨率和尺寸大小修改工具(完全免费)
  10. 服务器网络修复工具,常用LSP修复工具盘点 让你轻轻松松上网
  11. 什么是3322域名?3322域名如何注册?
  12. 百度云破解不限速版(绿色免安装)
  13. c语言camel游戏,将单词从camelCase转换为C中的snake_case
  14. 面试:React相关
  15. Formality使用总结1
  16. cdp备份和oracle备份,CDP与快照:两种不同数据保护方法
  17. 合并多个 .ts 文件为单个 .mp4 解决方案
  18. 主线Linux用shell命令切换 OTG
  19. 7-10 公路村村通 (最小生成树Prim算法) | PTA数据结构与算法——C语言实现
  20. MathType7精简版数学公式编辑器

热门文章

  1. 福利!在线编写代码的网站
  2. Python中获取两数相除的商和余数
  3. 纯js实现选择色卡效果
  4. Windows 组件服务我的电脑出现红色向下箭头
  5. ios设备苹果手机 js时间字符串转时间戳后显示错误NAN
  6. AutoCAD如何快速标注零件序号
  7. MD5 到底是不是加密?
  8. RabbitMq详解+SpringBoot整合RabbitMq快速入门
  9. Oracle索引 详解
  10. 穿山甲——流量变现新猛兽