C++ 获取 Windows 进程 CPU 和内存占用并打印表格数据
以下是使用 C++ 编写检测 Windows 系统下进程 CPU 跟内存占用并打印出带时间戳的表格数据的示例代码:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <iomanip>
#include <ctime>
using namespace std;
void printProcessInfo(DWORD processID) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
if (hProcess == NULL) {
cerr << 'Failed to open process ' << processID << endl;
return;
}
PROCESS_MEMORY_COUNTERS_EX pmc;
if (GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))) {
cout << setw(10) << processID << setw(15) << pmc.WorkingSetSize / 1024 << ' KB' << setw(15) << pmc.PrivateUsage / 1024 << ' KB';
}
else {
cerr << 'Failed to retrieve memory info for process ' << processID << endl;
}
FILETIME createTime, exitTime, kernelTime, userTime;
if (GetProcessTimes(hProcess, &createTime, &exitTime, &kernelTime, &userTime)) {
ULARGE_INTEGER ulKernelTime, ulUserTime;
ulKernelTime.LowPart = kernelTime.dwLowDateTime;
ulKernelTime.HighPart = kernelTime.dwHighDateTime;
ulUserTime.LowPart = userTime.dwLowDateTime;
ulUserTime.HighPart = userTime.dwHighDateTime;
ULONGLONG kernelTimeMs = ulKernelTime.QuadPart / (10 * 1000); // convert to milliseconds
ULONGLONG userTimeMs = ulUserTime.QuadPart / (10 * 1000); // convert to milliseconds
cout << setw(15) << kernelTimeMs << ' ms' << setw(15) << userTimeMs << ' ms';
}
else {
cerr << 'Failed to retrieve CPU time for process ' << processID << endl;
}
CloseHandle(hProcess);
}
int main() {
const int pid = 1234; // replace with the process ID you want to monitor
cout << setw(10) << 'PID' << setw(15) << 'Working Set' << setw(15) << 'Private Bytes' << setw(15) << 'Kernel Time' << setw(15) << 'User Time' << endl;
while (true) {
SYSTEMTIME time;
GetLocalTime(&time);
cout << setfill('0') << setw(2) << time.wHour << ':' << setw(2) << time.wMinute << ':' << setw(2) << time.wSecond << '.' << setw(3) << time.wMilliseconds << ' ';
printProcessInfo(pid);
cout << endl;
Sleep(1000); // wait for 1 second
}
return 0;
}
说明:
printProcessInfo函数用于打印给定进程的内存占用和 CPU 时间占用;main函数中使用GetLocalTime函数获取当前时间,然后调用printProcessInfo函数打印指定进程的信息,并等待 1 秒钟再继续循环;- 在输出表格数据时使用了一些格式化控制符,例如
setw用于设置字段宽度,setfill用于设置空白填充字符; - 该示例代码中只监测了一个进程,如果需要监测多个进程,可以将
pid变量改为一个数组,然后在循环中遍历数组并调用printProcessInfo函数。
原文地址: https://www.cveoy.top/t/topic/n7mn 著作权归作者所有。请勿转载和采集!