2011-11-16 16 views
6

Tengo un programa Delphi y estoy buscando cómo este programa podría imprimir su propia "tamaño virtual" en un archivo de registro, por lo que puedo ver cuando se utiliza demasiada memoria. ¿Cómo puedo determinar el "tamaño virtual" usando el código Delphi?proceso virtual usando Delphi

Por "tamaño virtual" que significa el valor como se muestra por Process Explorer. Este valor no puede ser mostrado por el administrador de tareas normal. No es directamente el uso de la memoria del programa, sino el uso del espacio de direcciones. En Win32, un programa no puede usar más de 2 GB de espacio de direcciones.

PS: Estoy usando Delphi 6 pero el código/datos para otras versiones debería estar bien también.

+0

En Windows de 64 bits, con LARGEADDRESSAWARE, un proceso de 32 bits puede utilizar el espacio de direcciones virtuales de 4 GB. En D6, debe cambiar MM (por ejemplo, a FastMM) para que esto funcione debido a errores en el MM Borland. –

Respuesta

10

Gracias a este post que da consejos sobre cómo conseguir un tamaño virtual utilizando C/C++, yo era capaz de escribir la siguiente función de Delphi:

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; 

Parece que funciona muy bien para mí (Delphi 6 , Win XP). Puede haber una solución más fácil usando GlobalMemoryStatus en lugar de GlobalMemoryStatusEx pero no funcionaría correctamente en sistemas con más de 2 GB de memoria.

+0

+1 Oh, sí. Para su propio proceso, este es el mejor método. –

6

Process Explorer seems hacerlo llamando NtQueryInformation pero también es posible utilizar los datos de rendimiento, consulte GetProcessVirtualBytes en mi respuesta here.

+0

+1 Gracias por la respuesta rápida. No lo he intentado porque encontré otra manera de hacerlo mientras tanto, pero parece ser una buena solución. – Name

+0

@Name Bienvenido, este método solo es necesario cuando se consultan procesos externos. Como dije en un comentario sobre su propia respuesta, su solución es la mejor en caso de que solo esté buscando la información sobre su propio proceso. –

1

Y para aquellos que ya dependen de lo que de otra manera es excelente Jedi Code Library, puede encontrar las definiciones que @Name señala correctamente en la unidad JclWin32.

Los números reales que necesita también están estallado como funciones individuales en la unidad JclSysInfo. Simplemente llame a GetTotalVirtualMemory() - GetFreeVirtualMemory() para hacer el cálculo.

+0

Gracias por su respuesta. – Name

Cuestiones relacionadas