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 -;
} 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的更多相关文章
- C# 获取程序运行时路径
Ø 前言 开发中,很多时候都需要获取程序运行时路径,比如:反射.文件操作等..NET Framework 已经封装了这些功能,可以很方便的使用. C# 中有很多类都可以获取程序运行时路径,我们没必要 ...
- 计算apk包的安装之后占用空间以及运行时占用内存
1.统计结果如下 计算apk安装占用空间大小方式 为了方式apk包运行时出现缓存数据等对空间计算造成影响.应该先进行安装,然后分别计算空间变化 所有apk包安装完毕后再运行 开启两个cmd窗口 第一个 ...
- c++程序运行时的内存分配《转》
C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 2.堆:是由new分配的 ...
- 实例分析C程序运行时的内存结构
先验知识 静态变量存储在静态存储区,局部变量存储在动态存储区(栈),代码存放在代码区 寄存器,EBP指向栈底,ESP指向栈顶,EIP指向正在执行指令的下一条指令,三个寄存器中保存的都是地址,32位 ...
- C程序运行时的内存分布
该篇博客是自己学习的总结,如果有哪里理解的不对的地方,希望大家可以指点. 一.C内存空间分布图 二.各内存区域详解 1.代码区(.text): 该区域主要存放二进制可执行文件. 2.数据区(.data ...
- [Java]程序运行时的内存分配
本文出处:<Thinking in JAVA> 寄存器这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制 ...
- c++ 程序编译后运行时的内存分配
程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...
- .NET Core 获取程序运行环境信息与反射的应用
目录 RuntimeInformation.Environment 获取信息 反射获取信息 获取某个属性的值以及别名 反射获取信息 使用 总结 笔者的九篇反射系统文章已经完结,但是笔者会持续更新反射在 ...
- C/C++ Windows API——获取系统指定目录(转)
原文地址:C/C++ Windows API——获取系统指定目录 经测试,在win10 VS2017中用wprintf()输出正常,SHGetSpecialFolderPath函数也正常运行 但是用M ...
随机推荐
- 【9206】 奖学金(NOIP2007)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成 ...
- scala 通过apply创建类的对象
package cn.scala_base.oop.scalaobject; class Boy(name: String) { private var age: Int = 0; println(n ...
- 不安装 oracle的客户,就可以使用pl/sql访问远程oracle 数据库的方法
免安装Oracle客户端使用PL/SQL连接Oracle 大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的.有没要想过不安装Oracle客户端直接连接Oracl ...
- WPF动态创建Image的显示问题
原文:WPF动态创建Image的显示问题 最近学习WPF,看到一篇教程讲解如何动态创建Image控件,自己练手时候无论如何也显示不出图片.刚开始以为是图片的路径有问题,可后来将图片的路径设为相对路径或 ...
- Visual Studio Code同时debug多种代码的方式
今天看了一下,猜应该是configurations里面多写一个就行,试了下,真的可以同时debug Python和Go代码. 可以打断点.单步执行Python和Go代码. launch.json 如下 ...
- 开始使用Material UI
Material-UI采用 Material Design风格的React UI组件,所以要想学习material ui先要了解react. material ui安装 Material-UI 可以使 ...
- Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式
引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...
- DDD实战2 创建领域基础类库项目
1.创建领域基础类库项目 取名DDD.DomainBase 放置于基础设施层 2.新建IEntity接口,内部创建2个属性 code和Id用于限定 public interface IEntity { ...
- 取消scrollView上下拉升
if (ios_Vewsion_5_Or_Above) { _scrollView.bounces = NO; } else { for (id subview in _scrollView.subv ...
- 简明Python3教程 13.面向对象编程
简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...