DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: bluewind23
今日帖子: 0
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2023/9/18 11:45:07
标题:
用GetProcessMemoryInfo获取的内存占用和任务管理器显示不一样? 浏览:647
加入我的收藏
楼主:
用GetProcessMemoryInfo获取的内存占用和任务管理器显示不一样?
用什么取才和任务管理器一致?现在到百度已查不到什么有用的信息了。
function GetPIdMemUsage(PID: dword): SIZE_T;
var
  memCounters: _PROCESS_MEMORY_COUNTERS;
  h: THandle; //cardinal;
begin
 result:=0;
  ZeroMemory(@memCounters, sizeof(memCounters));
  h := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
  if h <> 0 then
  begin
    memCounters.cb := sizeof(memCounters);
    if not GetProcessMemoryInfo(h, @memCounters, sizeof(memCounters)) then
      result := 0
         //   showmessage('Coulnd''t get memory info!')
    else
    begin
//          showmessage('Current : '+inttostr(memCounters.WorkingSetSize shr 10)+' K'#13#10+'Peak : '+inttostr(memCounters.PeakWorkingSetSize shr 10 )+' K'#13#10+'Pagefile : '+inttostr(memCounters.PageFaultCount shr 10)+' K');
      result :=memCounters.PeakWorkingSetSize shr 10;// memCounters.WorkingSetSize shr 10;
    end;
    closehandle(h);
  end;
end;
----------------------------------------------
永远是DELPHI初学者。
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/9/18 11:57:56
1楼: maybe you should use others ways...

https://learn.microsoft.com/zh-cn/windows/win32/psapi/process-memory-usage-information

进程内存使用情况信息
项目
2023/06/12
3 个参与者
GetProcessMemoryInfo 函数采用进程句柄作为输入,并使用有关进程的内存统计信息的信息填充PROCESS_MEMORY_COUNTERS结构。 cb 成员接收 结构的大小。 PageFaultCount 成员接收页面错误数。 其余成员按以下类别接收当前和峰值内存使用量:

工作集
分页池
非分页池
pagefile
工作集是在给定时间以物理方式映射到进程上下文的内存量。 分页池中的内存是系统内存,可以在不使用分页 () 传输到磁盘上的分页文件。 非分页池中的内存是系统内存,只要分配了相应的对象,系统内存就无法分页到磁盘。 页面文件使用情况表示系统分页文件中为进程预留的内存量。 当内存使用率过高时,虚拟内存管理器会将所选内存分页到磁盘。 当线程需要不在内存中的页时,内存管理器会从分页文件中重新加载它。
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/9/18 12:01:58
2楼: try this way

uses psAPI....

var 
  pmc: PPROCESS_MEMORY_COUNTERS; 
  cb: Integer; 
begin 
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS); 
  GetMem(pmc, cb);
  pmc^.cb := cb;
  if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
 ShowMessage(IntToStr(pmc^.WorkingSetSize) + ' Bytes')
else ShowMessage('Unable to get process info');
  FreeMem(pmc);
end;
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2023/9/18 12:39:26
3楼: 我想到到和任务管理器一样的占用内存数,有什么方法?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/9/18 16:02:28
4楼: 占用率不是取出来的, 
是计算出来的, 每一秒取值一次, 然后计算平均值.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2023/9/18 22:25:15
5楼: 这个VC 2015 代码:
// 内存a.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <Windows.h>

#include <TlHelp32.h>
#include <Psapi.h>


#pragma comment(lib,"Psapi.lib")
#pragma warning(disable: 4996)

void PrintMemCpuInfo()
{
  printf("是否显示每个进程内存和cpu信息(Y/N):");
//  int cChar = getch();

  //if (cChar != 'Y' && cChar != 'y') return;

  printf("\n%-30s%-30s%-30s\n", "进程", "mem-useage", "cpu-useage");

  /*PERFORMANCE_INFORMATION pif;
  memset(&pif,0,sizeof(pif));
  if( GetPerformanceInfo(&pif,sizeof(pif)) == FALSE)
  {
  printf("error-GetPerformanceInfo:%d\n",GetLastError());
  return;
  }*/
  SYSTEM_INFO si;
  GetSystemInfo(&si);

  OSVERSIONINFO osvi;//定义OSVERSIONINFO数据结构对象
  memset(&osvi, 0, sizeof(OSVERSIONINFO));//开空间 
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);//定义大小 
  GetVersionEx((OSVERSIONINFO *)&osvi);//获得版本信息 

            //typedef BOOL (WINAPI * JKQueryWorkingSet)(HANDLE,PVOID,DWORD);
            //JKQueryWorkingSet jkQueryWorkSet = NULL;
            //if (osvi.dwMajorVersion>=6) //vista above
            //{
            //  HMODULE hK32 = LoadLibraryA("Psapi.dll");
            //  jkQueryWorkSet = (JKQueryWorkingSet)GetProcAddress(hK32,"QueryWorkingSet");
            //}
            //else
            //{
            //  HMODULE hPsapi = LoadLibraryA("Psapi.dll");
            //  jkQueryWorkSet = (JKQueryWorkingSet)GetProcAddress(hPsapi,"QueryWorkingSet");
            //}

  HANDLE hSnap = CreateToolhelp32Snapshot((DWORD)TH32CS_SNAPPROCESS, 0);
  if (hSnap)
  {
    PROCESSENTRY32 entry = { sizeof entry };
    for (BOOL bState = Process32First(hSnap, &entry); bState; bState = Process32Next(hSnap, &entry))
    {
      HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, entry.th32ProcessID);
      if (hProcess)
      {
        DWORD dwMemProcess = 0;
        //----------
        if (osvi.dwMajorVersion<6)
        {
          PROCESS_MEMORY_COUNTERS_EX procCnt;
          if (GetProcessMemoryInfo(hProcess, (PPROCESS_MEMORY_COUNTERS)&procCnt, sizeof(procCnt)))
          {
            dwMemProcess = procCnt.WorkingSetSize*1.0f / 1024;
            if (dwMemProcess == 0) dwMemProcess = 1;
            
            _tprintf("a1%-30s%u KB\n", entry.szExeFile, dwMemProcess);
          }
        }
        else
        {
          //----------
          PSAPI_WORKING_SET_INFORMATION workSet;
          memset(&workSet, 0, sizeof(workSet));
          BOOL bOk = QueryWorkingSet(hProcess, &workSet, sizeof(workSet));
          if (bOk || (!bOk && GetLastError() == ERROR_BAD_LENGTH))
          {
            int nSize = sizeof(workSet.NumberOfEntries) + workSet.NumberOfEntries*sizeof(workSet.WorkingSetInfo);
            char* pBuf = new char[nSize];
            if (pBuf)
            {
              QueryWorkingSet(hProcess, pBuf, nSize);
              PSAPI_WORKING_SET_BLOCK* pFirst = (PSAPI_WORKING_SET_BLOCK*)(pBuf + sizeof(workSet.NumberOfEntries));
              DWORD dwMem = 0;
              for (ULONG_PTR nMemEntryCnt = 0; nMemEntryCnt<workSet.NumberOfEntries; nMemEntryCnt++, pFirst++)
              {
                if (pFirst->Shared == 0) dwMem += si.dwPageSize;
              }
              delete pBuf;

              if (workSet.NumberOfEntries>0)
              {
                dwMemProcess = dwMem / 1024;
                
                _tprintf("a2%-30s%u KB\n", entry.szExeFile, dwMemProcess);
              }
            }
          }
          else
          {
            printf("error-QueryWorkingSet:%d\n", GetLastError());
          }
        }

        CloseHandle(hProcess);
      }
      else
      {
        _tprintf(TEXT("error-process:%s打开失败\n"), entry.szExeFile);
      }
    }
    CloseHandle(hSnap);
  }

}


int main()
{
  PrintMemCpuInfo();
  system("pause");
    return 0;
}

显示的和任务管理器一样。我不会VC++,请能人帮转为DELPHI。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2023/9/18 22:28:28
6楼: QueryWorkingSet
在psAPI是有的,网上却查不到用法。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2023/9/19 7:26:24
7楼: 我没有能力把VC++代码转为DELPHI,只好用VC++编译一个DLL文件来给DELPHI调用。问题算是解决了。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2023/9/19 21:10:43
8楼: https://www.cnblogs.com/lsh123/p/8125194.html
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行69.82422毫秒 RSS