zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces 351D Jeff and Removing Periods 线段树
    Codeforces 1174E Ehab and the Expected GCD Problem
    Codeforces 696D Legen... AC自动机 + 矩阵快速幂
    Codeforces 827D Best Edge Weight 倍增 + 并查集 || 倍增 + 压倍增标记 (看题解)
    Codeforces 557E Ann and Half-Palindrome
    Codeforces 938F Erasing Substrings (看题解) dp
    Codeforces 1117F Crisp String
    Codeforces 643E Bear and Destroying Subtrees 树形dp (看题解)
    Codeforces 477D Dreamoon and Binary dp
    暑假第七周学习进度报告
  • 原文地址:https://www.cnblogs.com/findumars/p/6383030.html
Copyright © 2011-2022 走看看