2011-11-14 32 views
27

Làm thế nào tôi có thể nhận được thông tin này:thông tin bộ nhớ Bắt với Qt

  • Tổng Memory
  • Memory miễn phí
  • Memory sử dụng bởi ứng dụng đang chạy hiện tại?

Tôi nghĩ rằng Qt nên có các tùy chọn bộ nhớ, điều đó sẽ không phụ thuộc vào nền tảng, nhưng Tôi không thể tìm thấy nó. Vậy tôi có thể làm gì khi tôi muốn tạo một ứng dụng độc lập cho nền tảng hiển thị trạng thái bộ nhớ?

+0

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

Trả lời

42

Thật không may, không có gì được tích hợp vào Qt cho việc này. Bạn phải làm điều này cho mỗi nền tảng.

Dưới đây là một số mẫu để giúp bạn bắt đầu. Tôi đã phải thực hiện điều này trong một trong các ứng dụng của tôi chỉ tuần trước. Mã dưới đây vẫn còn rất nhiều trong phát triển; có thể có lỗi hoặc rò rỉ, nhưng ít nhất nó có thể hướng bạn đi đúng hướng. Tôi chỉ quan tâm đến tổng số RAM vật lý, nhưng các giá trị khác có sẵn theo cùng một cách. (Ngoại trừ có lẽ bộ nhớ được sử dụng bởi các ứng dụng hiện tại ... không chắc chắn về điều đó.)

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

Cảm ơn bạn đã nhập mã. –

+0

Câu trả lời hay. Cảm ơn –

+0

Điều gì về Android và iOS hiện tại mà Qt hỗ trợ chúng? – sashoalm

0

Hiện tại, điều này không thể thực hiện được trong Qt. Bạn sẽ cần phải ifdef các cuộc gọi bộ nhớ hệ điều hành khác nhau.

1

Tốt hơn nhiều trên POSIX hệ điều hành (Linux, Solaris, có lẽ hệ điều hành MacOS mới nhất ...):

  • getrusage (...) secially nhìn vào ru_maxrss.
  • getrlimit (...) nhưng tôi không tìm thấy bất kỳ thông tin hữu ích nào.
  • sysconf (...): _SC_PAGESIZE, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES
  • sysinfo (...): TOTALRAM, freeram, sharedram, totalswap, ...
  • báu

Vì vậy, nhiều trên các máy tính không có sẵn POSIX trên Windows.

Các vấn đề liên quan