首页 > 编程语言 >window 下查看指定程序的 CPU 使用情况

window 下查看指定程序的 CPU 使用情况

时间:2023-08-16 15:45:11浏览次数:74  
标签:last 查看 int system window time return include CPU

1、开发环境:window10 + QtCreator4.8.2 + Qt5.12.2

2、开发背景:满足查看指定程序运行过程中的 CPU 使用情况

3、实现方法:

  (1)通过程序名获取进程 ID

  (2)获取 CPU 核心数量

  (3)获取进程运行时间

  (4)统计进程运行时的 CPU 使用率并保存

  (5)实现代码和配置文件如下

//#include <stdafx.h>
#include <stdio.h>

#undef   UNICODE

#include <windows.h>
#include <stdint.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <iostream>
#include <vector>

#include <QFile>
#include <QDebug>
#include <QDateTime>
#include <QSettings>
#include <QCoreApplication>

using namespace std;

typedef long long           int64_t;
typedef unsigned long long  uint64_t;

// 时间转换
static uint64_t file_time_2_utc(const FILETIME* ftime)
{
    LARGE_INTEGER li;

    li.LowPart = ftime->dwLowDateTime;
    li.HighPart = ftime->dwHighDateTime;
    return li.QuadPart;
}

DWORD GetProcessIDByName(const char* pName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return NULL;
    }
    PROCESSENTRY32 pe = { sizeof(pe) };
    for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe))
    {
        if (strcmp(pe.szExeFile, pName) == 0)
        {
            CloseHandle(hSnapshot);
            return pe.th32ProcessID;
        }

        printf("%-6d %s\n", pe.th32ProcessID, pe.szExeFile);
    }
    CloseHandle(hSnapshot);
    return 0;
}



// 获得CPU的核数
static int get_processor_number()
{
    SYSTEM_INFO info;
    GetSystemInfo(&info);
    return (int)info.dwNumberOfProcessors;
}

int get_cpu_usage(int pid)
{
    //cpu数量
    static int processor_count_ = -1;
    //上一次的时间
    static int64_t last_time_ = 0;
    static int64_t last_system_time_ = 0;

    FILETIME now;
    FILETIME creation_time;
    FILETIME exit_time;
    FILETIME kernel_time;
    FILETIME user_time;
    int64_t system_time;
    int64_t time;
    int64_t system_time_delta;
    int64_t time_delta;

    int cpu = -1;

    if(processor_count_ == -1)
    {
        processor_count_ = get_processor_number();
    }

    GetSystemTimeAsFileTime(&now);

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
    {
        return -1;
    }
    system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time))
        / processor_count_;
    time = file_time_2_utc(&now);

    if ((last_system_time_ == 0) || (last_time_ == 0))
    {
        last_system_time_ = system_time;
        last_time_ = time;
        return get_cpu_usage(pid);
    }

    system_time_delta = system_time - last_system_time_;
    time_delta = time - last_time_;

    if (time_delta == 0)
        return get_cpu_usage(pid);

    cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
    last_system_time_ = system_time;
    last_time_ = time;
    return cpu;
}

int main()
{
    int cpu;
    int process_id;

    QString filePath = _pgmptr;
    filePath.remove("testcpu.exe");

    QString configPath = filePath + "/Setting.ini";

    /* 全新文件模式 旧文件存在直接删掉 */
    QFile fileConfig(configPath);
    if (!fileConfig.exists())
    {
        qWarning() << __PRETTY_FUNCTION__ << "文件不存在:" << configPath;
        return 0;
    }

    /* 文件生成 */
    QSettings setting(configPath, QSettings::IniFormat);
    setting.setIniCodec("UTF-8");

    /* 通用组数据读取 */
    setting.beginGroup("Process");
    QString process_name = setting.value("process_name").toString();
    process_name = process_name.split("#").first().simplified();
    process_name.remove("'");
    setting.endGroup();

    setting.beginGroup("Interval");
    QString interval_mString = setting.value("interval_m").toString();
    interval_mString = interval_mString.split("#").first().simplified();
    quint32 interval_m = interval_mString.toUInt();
    setting.endGroup();

    process_id = GetProcessIDByName(process_name.toLatin1());
    qDebug() << __PRETTY_FUNCTION__ << "process_id:" << process_id
             << process_name << process_name.toLatin1();

    if (process_id == 0)
    {
        qDebug() << __PRETTY_FUNCTION__ << "process_id abnormal:" << process_id;
        return 0;
    }

    QString savePath = filePath += "/test.txt";
    QFile fileSave(savePath);
    fileSave.remove();
    qDebug() << "savePath" << savePath;

    while(1)
    {
        cpu = get_cpu_usage(process_id);
        QString writeData = QString("%1 CPU: %2%")
                .arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss.zzz]"))
                .arg(cpu, 2);
        qDebug() << writeData;

        fileSave.open(QIODevice::ReadWrite | QIODevice::Append);
        fileSave.write(writeData.toLatin1() + "\n");
        fileSave.flush();
        fileSave.close();

        Sleep(interval_m);
    }

    return 0;
}
[Process]
process_name = 'QQ.exe'                # 进程名

[Interval]
interval_m = 1000  # 监测频率,以毫秒为单位

 

标签:last,查看,int,system,window,time,return,include,CPU
From: https://www.cnblogs.com/yangjinghui/p/17635254.html

相关文章

  • 查看本机的公网ip
    执行命令curlcip.cc返回结果IP :xxx.xxx.xxx.xxx地址 :国名省名市名运营商 :运营商名数据二 :XX省XX市|电信数据三 :X国X省X市|电信URL :http://www.cip.cc/xxx.xxx.xxx.xxx......
  • Systemd 查看开启自启的服务
     使用systemctl命令查看所有开机自启的服务:systemctllist-unit-files--type=service--state=enabledUNITFILESTATEauditd.serviceenabledautovt@.serviceenabled......
  • Oracle-RAC监听状态查看
    监听状态的查看,我们一般使用如下命令:lsnrctlstatus但是,这样一般查看到的是默认listener的状态,其他listener的状态需要,使用用如下命令:lsnrctlstatuslistener2lsnrctlstatuslistener_scan1那么,集群监听资源的状态如何查看呢?命令如下:[grid:rac01]:/home/grid>srvctlstatus......
  • Linux下查看根目录各文件内存占用情况
    一、服务器运行一点时间后各种的项目文件,日志文件,数据库备份登,会越来越多,在linux下可以使用du和df命令查看。1、df-h 命令查看整体磁盘使用情况2、 使用 du-ah--max-depth=1  /  可以查看根目录下各个文件占用情况 使用命令du-h–max-depth=1/var/log......
  • windows 优化
    #现象:Windows10中Tiworker.exe进程反复出现,占用大量CPUsc  deletewuauservwuauserv解决win+R打开运行输入services.msc打开服务找到windowsupdate服务右键属性,把启动类型调成禁用或手动,点击应用,最后按下面的停止应该这个进程就没了# scdeleteUsoSvc管理Window......
  • pycharm安装(windows10)
    下载地址https://www.jetbrains.com/pycharm/ 下载后,选择合适的路径安装,选项如下 默认JetBrains进行安装 安装后,重启电脑(后期手动重启也可) 重启后,激活PyCharm。双击PyCharm桌面软件PyCharm激活和插件(Plugins,CodeWithMe)激活。选择PyCharm的Activationcode激......
  • Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流
    场景Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/121202130上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。如果在其它业务场景下需要本地的视频文件模拟海康的rtsp流协议格式进行......
  • python+selenium(windows10) 安装
    1.安装python2. 安装selenium(piplist查看是否已安装)2.1 cmd窗口输入:pip(如果有内容显示,说明正常)        2.2 cmd输入指令安装selenium:pipinstallselenium==* .**.**( 也可以不指定版本)【如果安装中途断了,重新安装即可,不影响效果】 ......
  • Windows 操作系统命令行 netsh winsock reset 的作用详解
    这个命令是一个用于Windows操作系统中的网络故障排除工具,它用于重置Winsock相关的配置,以解决与网络连接和通信相关的问题。命令解释:netsh:这是Windows中的一个命令行工具,用于管理网络、接口和配置。winsock:这是WindowsSockets的缩写,是一种应用程序编程接口(API),用于......
  • Windows 操作系统命令行 netsh int ip reset 的作用详解
    netshintipreset命令是用于重置Windows操作系统中的网络设置和配置的命令。它是netsh命令行工具的一部分,用于管理网络设置。这个命令在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。让我们来详细解释这个命令及其使用场景。命令详解:netsh......