找回密码
 立即注册
收起左侧

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

5
回复
12449
查看
[复制链接]
累计签到:894 天
连续签到:1 天
来源: 原创 2015-4-7 08:59:37 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

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

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

附上代码
  1. int PainterArea::getUsedMemory(uint64_t *mem, uint64_t *vmem)
  2. {
  3.     PROCESS_MEMORY_COUNTERS pmc;

  4.     HANDLE process = NULL;

  5. //DWORD processID = GetProcessID();

  6.     //OpenProcessToken(GetCurrentProcess())

  7. //qDebug()<<"processID"<<processID << GetCurrentProcessId();

  8.     process = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,GetCurrentProcessId());

  9.     if(process == NULL)
  10.     {
  11.         qDebug()<<"null";
  12.         return -1;
  13.     }

  14.     if(GetProcessMemoryInfo(process,&pmc,sizeof(pmc))){
  15.         if(mem){
  16.             *mem = pmc.WorkingSetSize;
  17.         }
  18.         if(vmem){
  19.             *vmem = pmc.PagefileUsage;
  20.         }
  21.         return 0;
  22.     }

  23.     return -1;
  24. }
复制代码
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2015-4-15 19:38:24 显示全部楼层
本帖最后由 Syylc120317 于 2015-4-15 19:39 编辑

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

#include <windows.h>
  1. /**
  2.   * @author yuliuchuan
  3.   * @date 2015-04-10
  4.   * 查询程序占用内存。
  5.   * 思路:通过调用外部命令'tasklist /FI "PID EQ pid"'。
  6.   * 将返回的字符串首先替换掉',',
  7.   * 然后用正则表达式匹配已KB为单位表示内存的字符串,
  8.   * 最后换算为MB为单位返回。
  9.   */
  10. QString PainterArea::getUsedMemory(DWORD pid)
  11. {
  12.     char pidChar[25];
  13.     //将DWORD类型转换为10进制的char*类型
  14.     _ultoa(pid,pidChar,10);

  15.     //调用外部命令
  16.     QProcess p;
  17.     p.start("tasklist /FI "PID EQ " + QString(pidChar) + " "");
  18.     p.waitForFinished();
  19.     //得到返回结果
  20.     QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
  21.     //关闭外部命令
  22.     p.close();

  23.     //替换掉","
  24.     result = result.replace(",","");
  25.     //匹配 '数字+空格+K'部分。
  26.     QRegExp rx("(\\d+)(\\s)(K)");
  27.     //初始化结果
  28.     QString usedMem("");
  29.     if(rx.indexIn(result) != -1){
  30.         //匹配成功
  31.         usedMem = rx.cap(0);
  32.     }
  33.     //截取K前面的字符串,转换为数字,供换算单位使用。
  34.     usedMem = usedMem.left(usedMem.length() - 1);
  35.     //换算为MB的单位
  36.     return QString::number(usedMem.toDouble() / 1024) + " MB";
  37. }
复制代码
使用的时候,getUsedMemory(GetCurrentProcessId());
GetCurrentProcessId()是windows的api。
回复 支持 反对

使用道具 举报

尚未签到

2016-4-8 10:03:49 显示全部楼层
我惊呆了,好贴啊,很难得的好贴












野兔影院 www.lele55.com/yetu.html
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-2-9 17:18:59 显示全部楼层
其实还可以使用GlobalMemoryStatu**函数。

>> 原来Qt编译时加了-mthread
你这句话我表示看不懂。你是编译你自己的项目加了这个参数,还是编译整个Qt加了这个参数?
回复 支持 反对

使用道具 举报

累计签到:894 天
连续签到:1 天
2017-2-11 20:36:09 显示全部楼层
stlcours 发表于 2017-2-9 17:18
其实还可以使用GlobalMemoryStatu**函数。

>> 原来Qt编译时加了-mthread

GlobalMemoryStatu**函数有没有示例?百度的那个说的应该是编译Qt这个参数。我没整,我用的是安装版的。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-2-13 20:59:38 显示全部楼层
本帖最后由 stlcours 于 2017-2-13 21:04 编辑

QString GetMemInfo()
{
    QString strMem;
#ifdef Q_OS_WIN
    MEMORYSTATU** memoryInfo;
    memoryInfo.dwLength = sizeof(memoryInfo);
    GlobalMemoryStatu**(&memoryInfo);

/*
    m_memoryUsedLabel->setText(QObject::tr("内存使用率:"));
    m_totalPhysLabel->setText("总物理内存:");
    m_availPhysLabel->setText("可用物理内存:");
    m_totalPageFileLabel->setText("系统提交总数:");
    m_availPageFileLabel->setText("系统提交数:");
    m_totalVirtualLabel->setText("总虚拟内存:");
    m_availVirtualLabel->setText("可用虚拟内存:");
    m_availExVirtualLabel->setText("可用扩展虚拟:");
*/
    UINT mb = 1024 * 1024;
    strMem += "pourcentage : " + QString::number(memoryInfo.dwMemoryLoad).append("%")+'\n';
    strMem += "total memory : " + QString::number(memoryInfo.ullTotalPhys / mb)+'\n';
    strMem += "ullAvailPhys : " + QString::number(memoryInfo.ullAvailPhys / mb)+'\n';
    strMem += "ullTotalPageFile : " + QString::number(memoryInfo.ullTotalPageFile / mb)+'\n';
    strMem += "ullFreePageFile : " + QString::number(memoryInfo.ullTotalPageFile / mb - memoryInfo.ullAvailPageFile / mb)+'\n';
    strMem += "ullTotalVirtual : " + QString::number(memoryInfo.ullTotalVirtual / mb)+'\n';
    strMem += "ullAvailVirtual : " + QString::number(memoryInfo.ullAvailVirtual / mb)+'\n';
    strMem += "ullAvailExtendedVirtual : " + QString::number(memoryInfo.ullAvailExtendedVirtual / mb)+'\n';
#else
#endif
    return strMem;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了