Qt使用windows API獲取程序運行時佔用內存 good

使用的是psapi.h中的GetProcessMemoryInfo函數,可是運行到該函數時就強制退出了。php

後來,百度到緣由是 原來Qt編譯時加了-mthread,createprocess時要使的Handle可以線程繼承正則表達式

有沒有作過相似的的?或者其餘方式實現的?windows

 

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。
貼出代碼,分享。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。ui

 

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

相關文章
相關標籤/搜索