• Qt使用windows API获取程序运行时占用内存 good


    使用的是psapi.h中的GetProcessMemoryInfo函数,但是运行到该函数时就强制退出了。

    后来,百度到原因是 原来Qt编译时加了-mthread,createprocess时要使的Handle能够线程继承

    有没有做过类似的的?或者其他方式实现的?

    int PainterArea::getUsedMemory(uint64_t *mem, uint64_t *vmem)
    {
        PROCESS_MEMORY_COUNTERS pmc;
    
        HANDLE process = NULL;
    
    //DWORD processID = GetProcessID();
    
        //OpenProcessToken(GetCurrentProcess())
    
    //qDebug()<<"processID"<<processID << GetCurrentProcessId();
    
        process = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,GetCurrentProcessId());
    
        if(process == NULL)
        {
            qDebug()<<"null";
            return -1;
        }
    
        if(GetProcessMemoryInfo(process,&pmc,sizeof(pmc))){
            if(mem){
                *mem = pmc.WorkingSetSize;
            }
            if(vmem){
                *vmem = pmc.PagefileUsage;
            }
            return 0;
        }
    
        return -1;
    }

    自己解决的。
    使用windows的api。
    贴出代码,分享。

    #include <windows.h>

    /**
      * @author yuliuchuan
      * @date 2015-04-10
      * 查询程序占用内存。
      * 思路:通过调用外部命令'tasklist /FI "PID EQ pid"'。
      * 将返回的字符串首先替换掉',',
      * 然后用正则表达式匹配已KB为单位表示内存的字符串,
      * 最后换算为MB为单位返回。
      */
    QString PainterArea::getUsedMemory(DWORD pid)
    {
        char pidChar[25];
        //将DWORD类型转换为10进制的char*类型
        _ultoa(pid,pidChar,10);
    
        //调用外部命令
        QProcess p;
        p.start("tasklist /FI "PID EQ " + QString(pidChar) + " "");
        p.waitForFinished();
        //得到返回结果
        QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
        //关闭外部命令
        p.close();
    
        //替换掉","
        result = result.replace(",","");
        //匹配 '数字+空格+K'部分。
        QRegExp rx("(\d+)(\s)(K)");
        //初始化结果
        QString usedMem("");
        if(rx.indexIn(result) != -1){
            //匹配成功
            usedMem = rx.cap(0);
        }
        //截取K前面的字符串,转换为数字,供换算单位使用。
        usedMem = usedMem.left(usedMem.length() - 1);
        //换算为MB的单位
        return QString::number(usedMem.toDouble() / 1024) + " MB";
    }

    使用的时候,getUsedMemory(GetCurrentProcessId());
    GetCurrentProcessId()是windows的api。

    http://www.qter.org/forum.php?mod=viewthread&tid=2805&extra=page%3D1

  • 相关阅读:
    webpack 打包性能分析工具
    npm 使用
    npm 构建时,次要版本变化引起的问题
    AtomicStampedReference、AtomicMarkableReference 区别
    vue-cli 中的静态资源处理
    vue-cli 构建项目中 config/index.js 文件解读
    webpack的3个路径配置项: assetsRoot、assetsSubDirectory、assetsPublicPath
    Vue2 dist 目录下各个文件的区别
    DllPlugin、DllReferencePlugin 可以提取的第三方库列表
    JUC集合之 CopyOnWriteArrayList
  • 原文地址:https://www.cnblogs.com/findumars/p/6383030.html
Copyright © 2020-2023  润新知