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 ...
随机推荐
- 数组类型转换失败:NSMutableArray和NSArray的相互转换
1.数组类型转换无效(错误) @property(strong, nonatomic) NSMutableArray *temp_Array; _temp_Array=(NSMutableArray ...
- 初始化NSDictionary:(工作经验)两种方法有时候效果不一样
方法1: NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; [dic setObject:[Hp_KeysArray obj ...
- 【b604】2K进制数
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 设r是个2K进制数,并满足以下条件: (1)r至少是个2位的2K进制数. (2)作为2K进制数,除最后一 ...
- 6LoWPAN - Transmission of IPv6 Packets over IEEE 802.15.4 Networks
6LoWPAN covered topics include the following: Frame format for transmission of IPv6 packets Method ...
- TEdit,TMemo背景透明(SetWindowLong(WS_EX_TRANSPARENT)增加透明风格)
The component below works perfectly, except for the following problem: 1) Saves the component below ...
- Android菜鸟的成长笔记(16)——Service简介
Service是Android四大组件之一 1.Service与Activity的区别在:Service一直在后台运行,没有用户界面. 2.选择Activity与Service的标准:如果某个程序组件 ...
- PAT 1001-1010 题解
早期部分代码用 Java 实现.由于 PAT 虽然支持各种语言,但只有 C/C++标程来限定时间,许多题目用 Java 读入数据就已经超时,后来转投 C/C++.浏览全部代码:请戳 本文谨代表个人思路 ...
- 机器审核图片学习(1)pornDetector
a) https://github.com/bakwc/PornDetector 封装了两个库,opencv与scikit-learn 另外一种法师封装了opencv与tensorflow
- CentOS6.5系统挂载NTFS分区的移动硬盘
CentOS6.5系统挂载NTFS分区的移动硬盘 作为IT的工作者,避免不了使用Linux系统,我如今使用的系统是CentOS6.5 X86_64位版本号,可是插入NTFS移动硬盘没有办法识别.通过以 ...
- iText 制作PDF
前言 由于在MVC项目中需要使用PDF,所以自己抽空也来看看itext,以便于丰富自己的知识吧.在此也简单的记录一下,说不定以后可能还用的到. 在此您可以下载你想使用的版本http://sourcef ...