使用 Qt 获取内存信息

34

如何获取以下信息:

  • 总内存
  • 可用内存
  • 当前运行应用程序使用的内存?

我认为Qt应该有内存选项,可以实现跨平台,但是我找不到它。那么,当我想要制作一个显示内存状态的跨平台应用程序时,我该怎么做呢?


http://stackoverflow.com/questions/27201876/memory-management-issue-with-deleting-qquickview-in-qt5-3mingw32/27203897#27203897 - dtech
3个回答

55
很不幸,Qt 中没有内置此功能。您必须根据平台进行操作。
以下是一些示例可供参考。我上周刚在我的一个应用程序中实现了这个功能。下面的代码仍在积极开发中;可能存在错误或泄漏,但至少可以指引您正确的方向。我只对总物理 RAM 感兴趣,但其他值可以以同样的方式获取。(除了当前应用程序使用的内存...不确定那个怎么办。)
Windows (GlobalMemoryStatusEx)
MEMORYSTATUSEX memory_status;
ZeroMemory(&memory_status, sizeof(MEMORYSTATUSEX));
memory_status.dwLength = sizeof(MEMORYSTATUSEX);
if (GlobalMemoryStatusEx(&memory_status)) {
  system_info.append(
        QString("RAM: %1 MB")
        .arg(memory_status.ullTotalPhys / (1024 * 1024)));
} else {
  system_info.append("Unknown RAM");
}

Linux (/proc/meminfo)

QProcess p;
p.start("awk", QStringList() << "/MemTotal/ { print $2 }" << "/proc/meminfo");
p.waitForFinished();
QString memory = p.readAllStandardOutput();
system_info.append(QString("; RAM: %1 MB").arg(memory.toLong() / 1024));
p.close();

Mac(sysctl)
QProcess p;
p.start("sysctl", QStringList() << "kern.version" << "hw.physmem");
p.waitForFinished();
QString system_info = p.readAllStandardOutput();
p.close();

现在Qt支持Android和iOS,那它们的情况怎么样? - sashoalm
2
感谢您几年后的回复。不过需要补充一点,在Mac上,sysctl实际上需要使用hw.memsize而不是hw.physmem。输出结果类似于“hw.memsize: nnnnnnn”,以字节为单位返回,因此如果您想要MB,则仍然需要在将字符串转换为整数后执行/(1024 * 1024)操作。 - Gabe Weiss
1
Linux的例子不应该是:QString system_info = p.readAllStandardOuptut,而不是memory吗? - SPlatten
@sashoalm,由于Android使用Linux,上面针对Linux的答案也适用于Android。不确定iOS是否适用。 - user10146018
头文件包含会非常有帮助。 - plasmacel

3

在POSIX操作系统上(如Linux,Solaris和最新的MacOS...)表现更佳:

  • 使用getrusage(...)函数,特别关注ru_maxrss。
  • 使用getrlimit(...)函数,但我没有找到任何有用信息。
  • 使用sysconf(...)函数:_SC_PAGESIZE,_SC_PHYS_PAGES,_SC_AVPHYS_PAGES。
  • 使用sysinfo(...)函数:totalram,freeram,sharedram,totalswap等等。

在POSIX计算机上有许多宝藏,在Windows上不可用。


0

在Qt中目前无法实现这一点。您需要使用不同的操作系统内存调用进行条件编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接