2011-11-14 35 views
27

¿Cómo puedo obtener esta información:Obtener información de la memoria con Qt

  • Memoria total
  • Memoria Libre
  • de memoria utilizada por la aplicación actual en ejecución?

Creo que Qt debería tener opciones de memoria, que serían independientes de la plataforma, pero No puedo encontrarlo. Entonces, ¿qué puedo hacer cuando quiero hacer una aplicación independiente de la plataforma que muestre el estado de la memoria?

+0

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

Respuesta

42

Desafortunadamente, no hay nada integrado en Qt para esto. Debe hacer esto por plataforma.

Aquí hay algunos ejemplos para comenzar. Tuve que implementar esto en una de mis aplicaciones la semana pasada. El código a continuación todavía está en desarrollo; puede haber errores o filtraciones, pero al menos podría indicarle la dirección correcta. Solo me interesaba la RAM física total, pero los otros valores están disponibles de la misma manera. (Excepto quizás la memoria en uso por la aplicación actual ... no estoy seguro de que uno.)

de 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(); 
+0

Gracias por los códigos. –

+0

Gran respuesta. Gracias –

+0

¿Qué pasa con Android e iOS ahora que Qt los admite? – sashoalm

0

Actualmente no es posible en Qt. Necesitaría ifdef las diferentes llamadas de memoria del sistema operativo.

1

Mucho mejor en sistemas operativos POSIX (Linux, Solaris, MacOS quizás últimas ...):

  • getrusage (...) secially mirar ru_maxrss.
  • getrlimit (...) pero no encontré ninguna información útil en.
  • sysconf (...): _SC_PAGESIZE, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES
  • sysinfo (...): totalram, FreeRAM, sharedram, TotalSwap, ...

Tanto tesoros en los ordenadores POSIX no disponibles en Windows.

Cuestiones relacionadas