使用的是psapi.h中的GetProcessMemoryInfo函數,可是運行到該函數時就強制退出了。php
後來,百度到緣由是 原來Qt編譯時加了-mthread,createprocess時要使的Handle可以線程繼承正則表達式
有沒有作過相似的的?或者其餘方式實現的?windows
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。
貼出代碼,分享。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。ui
http://www.qter.org/forum.php?mod=viewthread&tid=2805&extra=page%3D1spa