GetProcessMemoryInfo进程\内存\计数器\例如PrivateUsage始终为0
我使用这个函数通过它的PID来确定进程内存的使用 使用常规的所有方法都可以,但我需要privateausage成员,它只存在于扩展结构进程\内存\计数器\ EX中 有几个文档促使我将扩展类型强制转换为基本类型,否则我的示例将无法编译 我仍然能够从基本成员(如PeakWorkingSetSize)获得值,但PrivateUsage始终为0。 我甚至试着重新定义PSAPI_版本——仍然没有。程序不能用PSAPI_版本<2编译 这是我的例子GetProcessMemoryInfo进程\内存\计数器\例如PrivateUsage始终为0,c,windows,memory,process,C,Windows,Memory,Process,我使用这个函数通过它的PID来确定进程内存的使用 使用常规的所有方法都可以,但我需要privateausage成员,它只存在于扩展结构进程\内存\计数器\ EX中 有几个文档促使我将扩展类型强制转换为基本类型,否则我的示例将无法编译 我仍然能够从基本成员(如PeakWorkingSetSize)获得值,但PrivateUsage始终为0。 我甚至试着重新定义PSAPI_版本——仍然没有。程序不能用PSAPI_版本
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
void _tmain (int argc, TCHAR *argv[])
{
// use first argument as PID
DWORD processID = strtol(argv[1],0, 0);
HANDLE hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE,
FALSE,
processID);
PROCESS_MEMORY_COUNTERS_EX pmc;
ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX));
// wait until process is dead
WaitForSingleObject( hProcess , INFINITE );
GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) );
fprintf(stdout, " PeakWorkingSetSize : %d\n", pmc.PeakWorkingSetSize);
fprintf(stdout, " PrivateUsage : %d\n", pmc.PrivateUsage);
CloseHandle(hProcess);
}
有什么建议可以解释为什么会这样吗
C:\utils>cl --version
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
在WIN7x64上运行。我知道这是一个非常老的问题,您可能不需要答案。但你们很接近。您在进程关闭后请求私有设置内存,因此不再存在进程的内存。因此,私有用法为0 相反,在我看来,您应该在一段固定的时间间隔后请求私有设置内存,直到进程终止。如果将间隔保持在非常低的水平,如1毫秒,则可以获得进程的近端内存 例如:
PROCESS_MEMORY_COUNTERS_EX pmc;
ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX));
//do for every millisecond until process terminates
do
{
ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX));
GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) );
}while(WaitForSingleObject( hProcess , 1));
// wait until process is dead
// WaitForSingleObject( hProcess , INFINITE );
// GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) );
fprintf(stdout, " PeakWorkingSetSize : %d\n", pmc.PeakWorkingSetSize);
fprintf(stdout, " PrivateUsage (Bytes): %d\n", pmc.PrivateUsage);
fprintf(stdout, " PrivateUsage (KB) : %f\n",(float)pmc.PrivateUsage/1024.0);
CloseHandle(hProcess);
执行上述更改后。将获得以下输出
C:\>PidMemory.exe 3456
PeakWorkingSetSize : 12427264
PrivateUsage (Bytes): 2269184
PrivateUsage (KB) : 2216.000000
这有时可能为零,因为在某些情况下,进程在while条件检查后已终止。因此,给出0。一个体面的工作就是记录私人使用的历史
例如
int history=0;
do
{
ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX));
GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) );
if(pmc.PrivateUsage != 0)
history = pmc.PrivateUsage;
}while(WaitForSingleObject( hProcess , 1));
我希望我能帮上忙。Hey@zamuka你有什么解决办法吗?没有。我放弃了,进入了JavaScriptLand=(听到这个消息我很难过。将扩展类型转换为基本类型对我来说很有效。
int history=0;
do
{
ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX));
GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) );
if(pmc.PrivateUsage != 0)
history = pmc.PrivateUsage;
}while(WaitForSingleObject( hProcess , 1));