2011-11-14 9 views
27

Come posso ottenere queste informazioni:Ottenere informazioni di memoria con Qt

  • Memoria totale
  • Free Memory
  • memoria utilizzato dall'applicazione correntemente in esecuzione?

Penso che Qt dovrebbe avere opzioni di memoria, che sarebbero indipendenti dalla piattaforma, ma non riesco a trovarlo. Quindi, cosa posso fare quando voglio creare un'applicazione indipendente dalla piattaforma che mostri lo stato della memoria?

+0

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

risposta

42

Sfortunatamente, non c'è nulla di costruito in Qt per questo. Devi fare questo per piattaforma.

Ecco alcuni esempi per iniziare. Ho dovuto implementarlo in una delle mie app la scorsa settimana. Il codice sotto è ancora molto in sviluppo; ci possono essere errori o perdite, ma potrebbe almeno indirizzarti nella direzione corretta. Mi interessava solo la RAM fisica totale, ma gli altri valori sono disponibili allo stesso modo. (Tranne forse memoria in uso dall'applicazione corrente ... non sono sicuro di quello.)

di 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

Grazie per i codici. –

+0

Ottima risposta. Grazie –

+0

Che ne dici di Android e iOS ora che Qt li supporta? – sashoalm

0

Attualmente non è possibile in Qt. Avresti bisogno di ifdef le diverse chiamate di memoria del sistema operativo.

1

Molto meglio su sistemi operativi POSIX (Linux, Solaris, forse gli ultimi MacOS ...):

  • getrusage (...) secially guardare ru_maxrss.
  • getrlimit (...) ma non ho trovato alcuna informazione utile in.
  • sysconf (...): _SC_PAGESIZE, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES
  • sysinfo (...): totalram, FreeRAM, sharedram, totalswap, ...

Tanto tesori su computer POSIX non disponibile Su Windows.

Problemi correlati