2011-11-16 32 views
6

Tôi có chương trình Delphi và tôi đang tìm cách chương trình này có thể in "kích thước ảo" của riêng mình trong tệp nhật ký, để tôi có thể thấy khi nào nó sử dụng quá nhiều bộ nhớ. Làm thế nào tôi có thể xác định "kích thước ảo" bằng cách sử dụng mã Delphi?Xác định quy trình kích thước ảo bằng delphi

Bởi "kích thước ảo", tôi có nghĩa là giá trị được hiển thị bởi Process Explorer. Giá trị này không thể được hiển thị bởi trình quản lý tác vụ thông thường. Nó không trực tiếp sử dụng bộ nhớ của chương trình nhưng việc sử dụng không gian địa chỉ. Trên Win32 một chương trình không thể sử dụng nhiều hơn 2 GB không gian địa chỉ.

PS: Tôi đang sử dụng Delphi 6 nhưng mã/thông tin cho các phiên bản khác cũng được chấp nhận.

+0

Trên Windows 64 bit, với LARGEADDRESSAWARE, quy trình 32 bit có thể sử dụng không gian địa chỉ ảo 4GB. Trên D6, bạn cần chuyển đổi MM (ví dụ: thành FastMM) để thực hiện công việc này do lỗi trong Borland MM. –

Trả lời

10

Nhờ post này mang đến cho những gợi ý về cách để có được một kích thước ảo sử dụng C/C++, tôi đã có thể viết hàm Delphi sau:

Type 
    TMemoryStatusEx = packed record 
    dwLength: DWORD; 
    dwMemoryLoad: DWORD; 
    ullTotalPhys: Int64; 
    ullAvailPhys: Int64; 
    ullTotalPageFile: Int64; 
    ullAvailPageFile: Int64; 
    ullTotalVirtual: Int64; 
    ullAvailVirtual: Int64; 
    ullAvailExtendedVirtual: Int64; 
    end; 
    TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall; 

function VirtualSizeUsage: Int64; 
var MSE: TMemoryStatusEx; 
    fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx; 
begin 
    Result := 0; 
    @fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx'); 
    if Assigned(@fnGlobalMemoryStatusEx) then 
    begin 
    MSE.dwLength := SizeOf(MSE); 
    if fnGlobalMemoryStatusEx(MSE) then 
     Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual; 
    end; 
end; 

Dường như với hoạt động tuyệt vời đối với tôi (Delphi 6 , Win XP). Có thể có giải pháp dễ dàng hơn bằng cách sử dụng GlobalMemoryStatus thay vì GlobalMemoryStatusEx nhưng nó sẽ không hoạt động chính xác trên các hệ thống có bộ nhớ hơn 2 GB.

+0

+1 Ồ vâng. Đối với quá trình của riêng bạn, đây là phương pháp tốt nhất. –

6

Process Explorer seems để thực hiện việc này bằng cách gọi NtQueryInformation nhưng cũng có thể sử dụng dữ liệu hiệu suất, xem GetProcessVirtualBytes trong câu trả lời của tôi here.

+0

+1 Cảm ơn câu trả lời nhanh. Tôi đã không thử nó bởi vì tôi tìm thấy một cách khác để làm điều đó trong khi chờ đợi, nhưng nó có vẻ là một giải pháp tốt. – Name

+0

@Name Chào mừng, phương pháp này chỉ cần thiết khi truy vấn các quy trình bên ngoài. Như tôi đã nói trong một bình luận cho câu trả lời của riêng bạn, giải pháp của bạn là tốt nhất trong trường hợp bạn chỉ đang tìm kiếm thông tin về quá trình của riêng bạn. –

1

Và đối với những người đã phụ thuộc vào cách khác tuyệt vời Jedi Code Library, bạn có thể tìm thấy định nghĩa mà @Name chính xác chỉ ra ở trên trong đơn vị JclWin32.

Số thực tế bạn cần cũng được chia nhỏ thành các hàm riêng lẻ trong đơn vị JclSysInfo. Chỉ cần gọi GetTotalVirtualMemory() - GetFreeVirtualMemory() để thực hiện phép tính.

+0

Cảm ơn câu trả lời của bạn. – Name

Các vấn đề liên quan