永发信息网

(急!在线等!答好了,追加分!)vc++获得内存专用工作集!

答案:1  悬赏:10  手机版
解决时间 2021-01-06 10:24
  • 提问者网友:我一贱你就笑
  • 2021-01-05 10:21
(急!在线等!答好了,追加分!)vc++获得内存专用工作集!
最佳答案
  • 五星知识达人网友:等灯
  • 2021-01-05 11:17
前段时间我做过,网上没怎么搜到这类资料,以下是我自己查阅MSDN找到的方法,和Windows任务管理器获取的信息一致。相信你能理解代码。
分两个步骤:
1.获取系统分页大小
PERFORMANCE_INFORMATION performanceInfo;
memset(&performanceInfo, 0, sizeof(performanceInfo));
if(!::GetPerformanceInfo(&performanceInfo, sizeof(performanceInfo)))
return FALSE;
m_stPageSize = performanceInfo.PageSize; // 获取页面大小, 单位:byte2.计算专用工作集
SIZE_T CProcessInfo::CalcWorkSetPrivate(HANDLE hProcess, SIZE_T pageSize)
{
BOOL bRet = TRUE;
PSAPI_WORKING_SET_INFORMATION workSetInfo;
PBYTE pByte = NULL;
PSAPI_WORKING_SET_BLOCK *pWorkSetBlock = workSetInfo.WorkingSetInfo;
memset(&workSetInfo, 0, sizeof(workSetInfo));
// 要求操作进程的权限:PROCESS_QUERY_INFORMATION and PROCESS_VM_READ
// 第一次调用获取实际缓冲区大小
bRet = ::QueryWorkingSet(hProcess, &workSetInfo, sizeof(workSetInfo));
if(!bRet) // 调用失败
{
if(GetLastError() == ERROR_BAD_LENGTH) // 需要重新分配缓冲区
{
DWORD realSize = sizeof(workSetInfo.NumberOfEntries) 
+ workSetInfo.NumberOfEntries*sizeof(PSAPI_WORKING_SET_BLOCK);
try
{
pByte = new BYTE[realSize];
memset(pByte, 0, realSize);
pWorkSetBlock = (PSAPI_WORKING_SET_BLOCK *)(pByte + sizeof(workSetInfo.NumberOfEntries));
// 重新获取
if(!::QueryWorkingSet(hProcess, pByte, realSize))
{
delete[] pByte; // 清理内存
return 0;
}

catch(CMemoryException *e) // 分配内存失败
{
e->Delete();
return 0;
}

}
else // 其它错误,认为获取失败
return 0;
}
SIZE_T workSetPrivate = 0;
for (ULONG_PTR i = 0; i < workSetInfo.NumberOfEntries; ++i)
{
if(!pWorkSetBlock[i].Shared) // 如果不是共享页
workSetPrivate += pageSize;
}
if(pByte)
delete[] pByte;
return workSetPrivate;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯