Подтвердить что ты не робот

Получение информации о памяти с помощью Qt

Как я могу получить эту информацию:

  • Общая память
  • Свободная память
  • Память, используемая текущим запущенным приложением?

Я думаю, Qt должен иметь параметры памяти, которые были бы независимы от платформы, но Я не могу найти его. Итак, что я могу сделать, когда хочу создать независимое от платформы приложение, которое показывает состояние памяти?

4b9b3361

Ответ 1

К сожалению, для этого нет ничего встроенного в 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();

Ответ 2

Гораздо лучше в ОС POSIX (Linux, Solaris, возможно, новейшие MacOS...):

  • getrusage (...) смотреть на ru_maxrss.
  • getrlimit (...), но я не нашел полезной информации.
  • sysconf (...): _SC_PAGESIZE, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES
  • sysinfo (...): totalram, freeram, sharedram, totalswap,...

Так много сокровищ на компьютерах POSIX не доступно в Windows.

Ответ 3

В настоящее время это невозможно в Qt. Вам понадобится ifdef для различных вызовов операционной системы.