單元 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;