소스 검색

add implement of 3 system platform.

runningwater 2 년 전
부모
커밋
64bbb07ca1
5개의 변경된 파일153개의 추가작업 그리고 7개의 파일을 삭제
  1. 6 1
      ch02-sysinfo.pro
  2. 51 0
      sysinfolinuximpl.cpp
  3. 28 0
      sysinfolinuximpl.h
  4. 62 6
      sysinfomacimpl.cpp
  5. 6 0
      sysinfomacimpl.h

+ 6 - 1
ch02-sysinfo.pro

@@ -22,8 +22,13 @@ windows {
     HEADERS += sysinfowindowsimpl.h
 }
 
+linux {
+    SOURCES += sysinfowindowsimpl.cpp
+    HEADERS += sysinfolinuximpl.h
+}
+
 macx {
-    SOURCES += sysinfomacimpl.cpp
+    SOURCES += sysinfolinuximpl.cpp
     HEADERS += sysinfomacimpl.h
 }
 

+ 51 - 0
sysinfolinuximpl.cpp

@@ -0,0 +1,51 @@
+#include "sysinfolinuximpl.h"
+
+#include <sys/sysinfo.h>
+#include <sys/types.h>
+
+SysInfoLinuxImpl::SysInfoLinuxImpl() : SysInfo(), mCpuLoadLastValues() {}
+
+void SysInfoLinuxImpl::init() { mCpuLoadLastValues = cpuRawData(); }
+
+double SysInfoLinuxImpl::cpuLoadAverage() {
+  QVector<qulonglong> firstSample = mCpuLoadLastValues;
+  QVector<qulonglong> secondSample = cpuRawData();
+  mCpuLoadLastValues = secondSample;
+  double overall = (secondSample[0] - firstSample[0]) +
+                   (secondSample[1] - firstSample[1]) +
+                   (secondSample[2] - firstSample[2]);
+  double total = overall + (secondSample[3] - firstSample[3]);
+  double percent = (overall / total) * 100.0;
+  return qBound(0.0, percent, 100.0);
+}
+
+double SysInfoLinuxImpl::memoryUsed() {
+  struct sysinfo memInfo;
+  sysinfo(&memInfo);
+  qulonglong totalMemory = memInfo.totalram;
+  totalMemory += memInfo.totalswap;
+  totalMemory *= memInfo.mem_unit;
+  qulonglong totalMemoryUsed = memInfo.totalram - memInfo.freeram;
+  totalMemoryUsed += memInfo.totalswap - memInfo.freeswap;
+  totalMemoryUsed *= memInfo.mem_unit;
+  double percent = (double)totalMemoryUsed / (double)totalMemory * 100.0;
+  return qBound(0.0, percent, 100.0);
+}
+
+QVector<qulonglong> SysInfoLinuxImpl::cpuRawData() {
+  QFile file("/proc/stat");
+  file.open(QIODevice::ReadOnly);
+  QByteArray line = file.readLine();
+  file.close();
+  qulonglong totalUser = 0, totalUserNice = 0, totalSystem = 0, totalIdle = 0;
+  std::sscanf(line.data(), "cpu %llu %llu %llu %llu", &totalUser,
+              &totalUserNice, &totalSystem, &totalIdle);
+
+  QVector<qulonglong> rawData;
+  rawData.append(totalUser);
+  rawData.append(totalUserNice);
+  rawData.append(totalSystem);
+  rawData.append(totalIdle);
+
+  return rawData;
+}

+ 28 - 0
sysinfolinuximpl.h

@@ -0,0 +1,28 @@
+#ifndef SYSINFOLINUXIMPL_H
+#define SYSINFOLINUXIMPL_H
+
+#include <QFile>
+#include <QIODevice>
+#include <QVector>
+#include <QtGlobal>
+
+#include "sysinfo.h"
+
+class SysInfoLinuxImpl : public SysInfo {
+ public:
+  SysInfoLinuxImpl();
+
+  // SysInfo interface
+ public:
+  void init() override;
+  double cpuLoadAverage() override;
+  double memoryUsed() override;
+
+ private:
+  QVector<qulonglong> cpuRawData();
+
+ private:
+  QVector<qulonglong> mCpuLoadLastValues;
+};
+
+#endif  // SYSINFOLINUXIMPL_H

+ 62 - 6
sysinfomacimpl.cpp

@@ -1,18 +1,74 @@
 #include "sysinfomacimpl.h"
 
+#include <mach/mach_host.h>
+#include <mach/mach_init.h>
+#include <mach/mach_types.h>
+#include <mach/vm_map.h>
+#include <mach/vm_statistics.h>
+
 SysInfoMacImpl::SysInfoMacImpl() : SysInfo() {}
 
-void SysInfoMacImpl::init()
-{
+void SysInfoMacImpl::init() { mCpuLoadLastValues = cpuRawData(); }
 
+double SysInfoMacImpl::cpuLoadAverage() {
+  QVector<qulonglong> firstSample = mCpuLoadLastValues;
+  QVector<qulonglong> secondSample = cpuRawData();
+  mCpuLoadLastValues = secondSample;
+  double overall = (secondSample[0] - firstSample[0]) +
+                   (secondSample[1] - firstSample[1]) +
+                   (secondSample[2] - firstSample[2]);
+  double total = overall + (secondSample[3] - firstSample[3]);
+  double percent = (overall / total) * 100.0;
+  return qBound(0.0, percent, 100.0);
 }
 
-double SysInfoMacImpl::cpuLoadAverage()
-{
+/**
+ * @brief SysInfoMacImpl::memoryUsed 系统内存使用
+ * @return 百分比
+ */
+double SysInfoMacImpl::memoryUsed() {
+  vm_size_t pageSize;
+  vm_statistics64_data_t vmStats;
+
+  // A machPort is a kind of special connection to the kernel that
+  //  enables us to request information about the system.
+  mach_port_t machPort = mach_host_self();
+  mach_msg_type_number_t count = sizeof(vmStats) / sizeof(natural_t);
+  host_page_size(machPort, &pageSize);
+
+  host_statistics64(machPort, HOST_VM_INFO, (host_info64_t)&vmStats, &count);
 
+  qulonglong freeMemory = (int64_t)vmStats.free_count * (int64_t)pageSize;
+  qulonglong totalMemoryUsed =
+      ((int64_t)vmStats.active_count + (int64_t)vmStats.inactive_count +
+       (int64_t)vmStats.wire_count) *
+      (int64_t)pageSize;
+
+  qulonglong totalMemory = freeMemory + totalMemoryUsed;
+  double percent = (double)totalMemoryUsed / (double)totalMemory * 100.0;
+  return qBound(0.0, percent, 100.0);
 }
 
-double SysInfoMacImpl::memoryUsed()
-{
+QVector<qulonglong> SysInfoMacImpl::cpuRawData() {
+  host_cpu_load_info_data_t cpuInfo;
+  mach_msg_type_number_t cpuCount = HOST_CPU_LOAD_INFO_COUNT;
+  QVector<qulonglong> rawData;
+  qulonglong totalUser = 0, totalUserNice = 0, totalSystem = 0, totalIdle = 0;
+
+  host_statistics64(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpuInfo,
+                    &cpuCount);
+  for (unsigned int i = 0; i < cpuCount; i++) {
+    unsigned int maxTicks = CPU_STATE_MAX * i;
+
+    totalUser += cpuInfo.cpu_ticks[maxTicks + CPU_STATE_USER];
+    totalUserNice += cpuInfo.cpu_ticks[maxTicks + CPU_STATE_SYSTEM];
+    totalSystem += cpuInfo.cpu_ticks[maxTicks + CPU_STATE_NICE];
+    totalIdle += cpuInfo.cpu_ticks[maxTicks + CPU_STATE_IDLE];
+  }
 
+  rawData.append(totalUser);
+  rawData.append(totalUserNice);
+  rawData.append(totalSystem);
+  rawData.append(totalIdle);
+  return rawData;
 }

+ 6 - 0
sysinfomacimpl.h

@@ -15,6 +15,12 @@ class SysInfoMacImpl : public SysInfo {
   void init() override;
   double cpuLoadAverage() override;
   double memoryUsed() override;
+
+ private:
+  QVector<qulonglong> cpuRawData();
+
+ private:
+  QVector<qulonglong> mCpuLoadLastValues;
 };
 
 #endif  // SYSINFOMACIMPL_H