sysinfolinuximpl.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "sysinfolinuximpl.h"
  2. #include <sys/sysinfo.h>
  3. #include <sys/types.h>
  4. SysInfoLinuxImpl::SysInfoLinuxImpl() : SysInfo(), mCpuLoadLastValues() {}
  5. void SysInfoLinuxImpl::init() { mCpuLoadLastValues = cpuRawData(); }
  6. double SysInfoLinuxImpl::cpuLoadAverage() {
  7. QVector<qulonglong> firstSample = mCpuLoadLastValues;
  8. QVector<qulonglong> secondSample = cpuRawData();
  9. mCpuLoadLastValues = secondSample;
  10. double overall = (secondSample[0] - firstSample[0]) +
  11. (secondSample[1] - firstSample[1]) +
  12. (secondSample[2] - firstSample[2]);
  13. double total = overall + (secondSample[3] - firstSample[3]);
  14. double percent = (overall / total) * 100.0;
  15. return qBound(0.0, percent, 100.0);
  16. }
  17. double SysInfoLinuxImpl::memoryUsed() {
  18. struct sysinfo memInfo;
  19. sysinfo(&memInfo);
  20. qulonglong totalMemory = memInfo.totalram;
  21. totalMemory += memInfo.totalswap;
  22. totalMemory *= memInfo.mem_unit;
  23. qulonglong totalMemoryUsed = memInfo.totalram - memInfo.freeram;
  24. totalMemoryUsed += memInfo.totalswap - memInfo.freeswap;
  25. totalMemoryUsed *= memInfo.mem_unit;
  26. double percent = (double)totalMemoryUsed / (double)totalMemory * 100.0;
  27. return qBound(0.0, percent, 100.0);
  28. }
  29. QVector<qulonglong> SysInfoLinuxImpl::cpuRawData() {
  30. QFile file("/proc/stat");
  31. file.open(QIODevice::ReadOnly);
  32. QByteArray line = file.readLine();
  33. file.close();
  34. qulonglong totalUser = 0, totalUserNice = 0, totalSystem = 0, totalIdle = 0;
  35. std::sscanf(line.data(), "cpu %llu %llu %llu %llu", &totalUser,
  36. &totalUserNice, &totalSystem, &totalIdle);
  37. QVector<qulonglong> rawData;
  38. rawData.append(totalUser);
  39. rawData.append(totalUserNice);
  40. rawData.append(totalSystem);
  41. rawData.append(totalIdle);
  42. return rawData;
  43. }