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;

 

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