使用的是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 -;
} if(GetProcessMemoryInfo(process,&pmc,sizeof(pmc))){
if(mem){
*mem = pmc.WorkingSetSize;
}
if(vmem){
*vmem = pmc.PagefileUsage;
}
return ;
} return -;
}

自己解决的。
使用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[];
//将DWORD类型转换为10进制的char*类型
_ultoa(pid,pidChar,); //调用外部命令
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) != -){
//匹配成功
usedMem = rx.cap();
}
//截取K前面的字符串,转换为数字,供换算单位使用。
usedMem = usedMem.left(usedMem.length() - );
//换算为MB的单位
return QString::number(usedMem.toDouble() / ) + " MB";
}

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

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

Qt使用windows API获取程序运行时占用内存 good的更多相关文章

  1. C# 获取程序运行时路径

    Ø  前言 开发中,很多时候都需要获取程序运行时路径,比如:反射.文件操作等..NET Framework 已经封装了这些功能,可以很方便的使用. C# 中有很多类都可以获取程序运行时路径,我们没必要 ...

  2. 计算apk包的安装之后占用空间以及运行时占用内存

    1.统计结果如下 计算apk安装占用空间大小方式 为了方式apk包运行时出现缓存数据等对空间计算造成影响.应该先进行安装,然后分别计算空间变化 所有apk包安装完毕后再运行 开启两个cmd窗口 第一个 ...

  3. c++程序运行时的内存分配《转》

    C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 2.堆:是由new分配的 ...

  4. 实例分析C程序运行时的内存结构

      先验知识 静态变量存储在静态存储区,局部变量存储在动态存储区(栈),代码存放在代码区 寄存器,EBP指向栈底,ESP指向栈顶,EIP指向正在执行指令的下一条指令,三个寄存器中保存的都是地址,32位 ...

  5. C程序运行时的内存分布

    该篇博客是自己学习的总结,如果有哪里理解的不对的地方,希望大家可以指点. 一.C内存空间分布图 二.各内存区域详解 1.代码区(.text): 该区域主要存放二进制可执行文件. 2.数据区(.data ...

  6. [Java]程序运行时的内存分配

    本文出处:<Thinking in JAVA> 寄存器这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制 ...

  7. c++ 程序编译后运行时的内存分配

    程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...

  8. .NET Core 获取程序运行环境信息与反射的应用

    目录 RuntimeInformation.Environment 获取信息 反射获取信息 获取某个属性的值以及别名 反射获取信息 使用 总结 笔者的九篇反射系统文章已经完结,但是笔者会持续更新反射在 ...

  9. C/C++ Windows API——获取系统指定目录(转)

    原文地址:C/C++ Windows API——获取系统指定目录 经测试,在win10 VS2017中用wprintf()输出正常,SHGetSpecialFolderPath函数也正常运行 但是用M ...

随机推荐

  1. springboot启动tomcat报错java.lang.NoClassDefFoundError: javax/el/ELManager仅记录

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'o ...

  2. Android菜鸟的成长笔记(22)——Android进程间传递复杂数据(AIDL)

    在上一篇中介绍了Andorid中的进程间的通信方式AIDL,本篇文章将介绍传递复杂数据的AIDL Service 下面通过一个示例说明: 本例子中用到了两个自定义类型:Person与Pet, 其中Pe ...

  3. C# TimeSpan 时间计算

    原文:C# TimeSpan 时间计算 本文告诉大家简单的方法进行时间计算. 实际上使用 TimeSpan 可以做到让代码比较好懂,而代码很简单. 例如我使用下面的代码表示 5 秒 const int ...

  4. numpy 辨异(二) —— np.identity()/np.eye()

    import numpy as np; 两者在创建单位矩阵上,并无区别,两者的区别主要在接口上: np.identity(n, dtype=None):只能获取方阵,也即标准意义的单位阵: np.ey ...

  5. vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译

    vcmi源码编译 windows+cmake+mingw ##1 准备 HoMM3 gog.com CMake 官网 vcmi 源码 下载 QT5 with mingw 官网 Boost 源码1.55 ...

  6. Windows下安装MySQL(解压版本)

    解压缩 将下载到的文件解压缩到自己喜欢的位置,例如我自己的位置是D:\Program Files\mysql-5.7.10-winx64 添加环境变量 右键计算机->属性->高级系统设置- ...

  7. Linux性能测试 ps命令

    名称:ps 使用权限:所有使用者 使用方式:ps [options] [--help] 说明:显示瞬间行程 (process) 的动态 参数: ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍 ...

  8. mysqldump 定时备份数据(全量)

    MYSQL 数据库备份有很多种(cp.tar.lvm2.mysqldump.xtarbackup)等等,具体使用哪一个还要看你的数据规模.下面给出一个表 #摘自<学会用各种姿态备份Mysql数据 ...

  9. 几种常见RuntimeException

    一般面试java Exception(runtimeException )是个问题必须要问 常见的异常上市45种,它的基本要求.许多其他....需要注意的积累   常见的几种例如以下:   NullP ...

  10. Matlab随笔之模拟退火算法

    问题描述: 我方有一个基地,经度和纬度为( 70,40).假设我方飞机的速度为 1000 公里/小时. 我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地.在敌方每一目 标点的侦察时间不计 ...