您的位置:首页 > 编程语言 > Qt开发

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

2017-02-09 17:16 686 查看
使用的是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: