Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GetProcessMemoryInfo进程\内存\计数器\例如PrivateUsage始终为0_C_Windows_Memory_Process - Fatal编程技术网

GetProcessMemoryInfo进程\内存\计数器\例如PrivateUsage始终为0

GetProcessMemoryInfo进程\内存\计数器\例如PrivateUsage始终为0,c,windows,memory,process,C,Windows,Memory,Process,我使用这个函数通过它的PID来确定进程内存的使用 使用常规的所有方法都可以,但我需要privateausage成员,它只存在于扩展结构进程\内存\计数器\ EX中 有几个文档促使我将扩展类型强制转换为基本类型,否则我的示例将无法编译 我仍然能够从基本成员(如PeakWorkingSetSize)获得值,但PrivateUsage始终为0。 我甚至试着重新定义PSAPI_版本——仍然没有。程序不能用PSAPI_版本

我使用这个函数通过它的PID来确定进程内存的使用

使用常规的所有方法都可以,但我需要privateausage成员,它只存在于扩展结构进程\内存\计数器\ EX中

有几个文档促使我将扩展类型强制转换为基本类型,否则我的示例将无法编译

我仍然能够从基本成员(如PeakWorkingSetSize)获得值,但PrivateUsage始终为0。 我甚至试着重新定义PSAPI_版本——仍然没有。程序不能用PSAPI_版本<2编译

这是我的例子

#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));