delphi 取得当前进程的内存使用情况及线程数

单元 uses Windows, PsAPI;

1.获取当前进程句柄:GetCurrentProcess

2.获取当前进程内存占用情况:GetProcessMemoryInfo

示例如下:

// 取得当前进程占用内存
function CurrentMemoryUsage: Cardinal;
var
  pmc: TProcessMemoryCounters;
begin
  pmc.cb := SizeOf(pmc);
  if GetProcessMemoryInfo(GetCurrentProcess, @pmc, SizeOf(pmc)) then
    result := pmc.WorkingSetSize
  else
    RaiseLastOSError;
end;

3.获得系统的内存状态:GlobalMemoryStatus

  GlobalMemoryStatus,Win32 API函数。

  此函数用来获得当前可用的物理和虚拟内存信息,函数定义为:

  void GlobalMemoryStatus(

  LPMEMORYSTATUS lpBuffer

  );

  此函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。

  此函数用来替代用来支持16位应用程序的GetFreeSpace函数。

  应用程序应该在申请内存前调用此函数以防止影响到其他程序运行。

  这个函数的返回值是动态的,并且可能返回相同的值。

  关于MEMORYSTATUS结构体:

typedef struct _MEMORYSTATUS { // mst
  DWORD dwLength; // sizeof(MEMORYSTATUS)
  DWORD dwMemoryLoad; // percent of memory in use
  DWORD dwTotalPhys; // bytes of physical memory
  DWORD dwAvailPhys; // free physical memory bytes
  DWORD dwTotalPageFile; // bytes of paging file
  DWORD dwAvailPageFile; // free bytes of paging file
   DWORD dwTotalVirtual; // user bytes of address space
    DWORD dwAvailVirtual; // free user bytes
  } MEMORYSTATUS, *LPMEMORYSTATUS;

   结构成员的含义:

  dwLength:MEMORYSTATUS结构的大小,在调GlobalMemoryStatus函数前用sizeof()函数求得,用来供函数检测结构的版本。

  dwMemoryLoad:返回一个介于0~100之间的值,用来指示当前系统内存的使用率。

  dwTotalPhys:返回总的物理内存大小,以字节(byte)为单位。

  dwAvailPhys:返回可用的物理内存大小,以字节(byte)为单位。

  dwTotalPageFile:显示可以存在页面文件中的字节数。注意这个数值并不表示在页面文件在磁盘上的真实物理大小。

  dwAvailPageFile:返回可用的页面文件大小,以字节(byte)为单位。

  dwTotalVirtual:返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。

  dwAvailVirtual:返回调用进程的用户模式部分的实际自由可用的虚拟地址空间,以字节(byte)为单位。

  MEMORYSTATUS结构的定义如下:

  MEMORYSTATUS STRUCT

  dwLength DWORD ? ;本结构的长度

  dwMemoryLoad DWORD ? ;已用内存的百分比

  dwTotalPhys DWORD ? ;物理内存总量

  dwAvailPhys DWORD ? ;可用物理内存

  dwTotalPageFile DWORD ? ;交换文件总的大小

  dwAvailPageFile DWORD ? ;交换文件中空闲部分大小

  dwTotalVirtual DWORD ? ;用户可用的地址空间

  dwAvailVirtual DWORD ? ;当前空闲的地址空间

  MEMORYSTATUS ENDS

4.取得当前进程的线程数

Talk is easy, SHOW you the code:

// 取得当前进程的线程数
function GetProcessThreadCount: integer;
var
  SnapProcHandle: THandle;
  ThreadEntry: TThreadEntry32;
  Next: boolean;
begin
  result := 0;
  SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if SnapProcHandle <> THandle(-1) then
  begin
    ThreadEntry.dwSize := SizeOf(ThreadEntry);
    Next := Thread32First(SnapProcHandle, ThreadEntry);
    while Next do
    begin
      if (ThreadEntry.th32OwnerProcessID = GetCurrentProcessId) then
        result := result + 1;
      Next := Thread32Next(SnapProcHandle, ThreadEntry);
    end;
    CloseHandle(SnapProcHandle);
  end;
end;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章