2011-11-14 48 views
27

獲取內存信息如何獲得這樣的信息:通過當前正在運行的應用程序所使用使用Qt

  • 總內存
  • 可用內存
  • 記憶?

我認爲Qt應該有內存選項,這將是平臺無關的,但我無法找到它 。那麼當我想創建一個顯示內存狀態的獨立於平臺的應用程序時,我該怎麼辦?

+0

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

回答

42

不幸的是,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(); 
+0

謝謝你的代碼。 –

+0

很好的答案。謝謝 –

+0

現在Qt支持他們的Android和iOS呢? – sashoalm

0

這是目前在Qt中不可能的。您將需要ifdef不同的操作系統內存調用。

1

對POSIX操作系統(Linux,Solaris和最新也許MacOS的...)好多了:

  • 的getrusage(...)secially看ru_maxrss。
  • getrlimit(...)但我沒有找到任何有用的信息。
  • 的sysconf(...):_SC_PAGESIZE,_SC_PHYS_PAGES,_SC_AVPHYS_PAGES
  • SYSINFO(...):TOTALRAM中,freeram,sharedram,totalswap,...

這麼多寶物上沒有POSIX電腦在Windows上。