diff --git a/ScreenPlaySysInfo/ScreenPlaySysInfo.pro b/ScreenPlaySysInfo/ScreenPlaySysInfo.pro index 6d6dfc15..8d7d5f68 100644 --- a/ScreenPlaySysInfo/ScreenPlaySysInfo.pro +++ b/ScreenPlaySysInfo/ScreenPlaySysInfo.pro @@ -17,7 +17,8 @@ HEADERS += \ screenplaysysinfo_plugin.h \ sysinfo.h \ cpu.h \ - ram.h + ram.h \ + mathhelper.h DISTFILES = qmldir diff --git a/ScreenPlaySysInfo/cpu.cpp b/ScreenPlaySysInfo/cpu.cpp index 9cb13626..dc5be043 100644 --- a/ScreenPlaySysInfo/cpu.cpp +++ b/ScreenPlaySysInfo/cpu.cpp @@ -1,13 +1,13 @@ #include "cpu.h" #include +#include "mathhelper.h" #define STATUS_SUCCESS 0 #define STATUS_INFO_LENGTH_MISMATCH 0xC0000004 CPU::CPU(QObject *parent) : QObject(parent) { - - // signal obj, signal function pointer, slot obj, slot function pointer + // signal obj, signal function pointer, slot obj, slot function pointer connect(&m_updateTimer,&QTimer::timeout,this,&CPU::update); m_updateTimer.start(m_tickRate); } @@ -15,22 +15,35 @@ CPU::CPU(QObject *parent) : QObject(parent) void CPU::update() { -// long status = 0; -// unsigned long bufSize = c_BufferSize; -// byte* buf = (bufSize > 0) ? new BYTE[bufSize] : nullptr; + BOOL status; + FILETIME ftIdleTime, ftKernelTime, ftUserTime; + // get new CPU's idle/kernel/user time + status = GetSystemTimes(&ftIdleTime, &ftKernelTime, &ftUserTime); + if (status == 0) return; + //convert times to uint by appending low and high bits + uint64_t newIdleTime = FileTimeToInt64(ftIdleTime); + uint64_t newKernelTime = FileTimeToInt64(ftKernelTime); + uint64_t newUserTime = FileTimeToInt64(ftUserTime); -// status = c_NtQuerySystemInformation(SystemProcessorPerformanceInformation, buf, bufSize, &size); + //subtract old times + uint64_t userTime = newUserTime - lastUserTime; + uint64_t kernelTime = newKernelTime - lastKernelTime; + double idleTime = newIdleTime - lastIdleTime; -// switch (status) { -// case STATUS_INFO_LENGTH_MISMATCH: -// qWarning() << "Warning: Status info length mismatch!"; -// break; -// case STATUS_SUCCESS: + //calculate the usage + double sysTime = kernelTime + userTime; + float currentUsage = float((sysTime - idleTime) * 100 / sysTime); -// break; -// default: -// break; -// } + //save the new values + lastIdleTime = newIdleTime; + lastKernelTime = newKernelTime; + lastUserTime = newUserTime; + + float cu = int(currentUsage * 100); + currentUsage = float(cu / 100); + + //publish result + setUsage(currentUsage); } diff --git a/ScreenPlaySysInfo/cpu.h b/ScreenPlaySysInfo/cpu.h index c1d32ab7..34fe4a65 100644 --- a/ScreenPlaySysInfo/cpu.h +++ b/ScreenPlaySysInfo/cpu.h @@ -3,15 +3,13 @@ #include #include #include +#include #ifdef Q_OS_WIN #include #endif // https://github.com/rainmeter/rainmeter/blob/master/Library/MeasureCPU.cpp -#ifdef Q_OS_WIN -typedef LONG(WINAPI* FPNTQSI)(UINT, PVOID, ULONG, PULONG); -#endif class CPU : public QObject { Q_OBJECT @@ -19,6 +17,7 @@ class CPU : public QObject { Q_PROPERTY(float usage READ usage NOTIFY usageChanged) Q_PROPERTY(int tickRate READ tickRate WRITE setTickRate NOTIFY tickRateChanged) + public: explicit CPU(QObject* parent = nullptr); @@ -39,12 +38,12 @@ signals: void tickRateChanged(int tickRate); + public slots: void update(); void setUsage(float usage) { - qWarning("Floating point comparison needs context sanity check"); if (qFuzzyCompare(m_usage, usage)) return; @@ -63,17 +62,15 @@ public slots: emit tickRateChanged(m_tickRate); } + + private: - float m_usage = 42.0f; + float m_usage = 0.0f; - int m_Processor; + uint64_t lastIdleTime = 0; + uint64_t lastKernelTime = 0; + uint64_t lastUserTime = 0; - double m_OldTime[2]; - - //static FPNTQSI c_NtQuerySystemInformation; - - static int c_NumOfProcessors; - //static ULONG c_BufferSize; - int m_tickRate = 500; + int m_tickRate = 1000; QTimer m_updateTimer; }; diff --git a/ScreenPlaySysInfo/mathhelper.h b/ScreenPlaySysInfo/mathhelper.h new file mode 100644 index 00000000..e5e1b097 --- /dev/null +++ b/ScreenPlaySysInfo/mathhelper.h @@ -0,0 +1,10 @@ +#pragma once +#include +#include + +uint64_t FileTimeToInt64( const FILETIME& ft ) { + ULARGE_INTEGER uli = { }; + uli.LowPart = ft.dwLowDateTime; + uli.HighPart = ft.dwHighDateTime; + return uli.QuadPart; +} diff --git a/ScreenPlaySysInfo/ram.cpp b/ScreenPlaySysInfo/ram.cpp index 3f813dfc..eb3b99bc 100644 --- a/ScreenPlaySysInfo/ram.cpp +++ b/ScreenPlaySysInfo/ram.cpp @@ -1,8 +1,34 @@ #include "ram.h" #include #include +#include "sysinfoapi.h" + RAM::RAM(QObject* parent) : QObject(parent) { - + connect(&m_updateTimer,&QTimer::timeout,this,&RAM::update); + m_updateTimer.start(m_tickRate); +} + +void RAM::update() +{ + //Get values from system + MEMORYSTATUSEX memoryStatus; + memoryStatus.dwLength = sizeof(MEMORYSTATUSEX); //needed for internal api + bool success = GlobalMemoryStatusEx(&memoryStatus); + if(!success) + return; + + //Apply total values + setTotalPhysicalMemory(memoryStatus.ullTotalPhys); + setTotalPagingMemory(memoryStatus.ullTotalPageFile); + setTotalVirtualMemory(memoryStatus.ullTotalVirtual); + + //calculate usages + setUsedPhysicalMemory(m_totalPhysicalMemory - memoryStatus.ullAvailPhys); + setUsedPagingMemory(m_totalPagingMemory - memoryStatus.ullAvailPageFile); + setUsedVirtualMemory(m_totalVirtualMemory - memoryStatus.ullAvailVirtual); + + //set overall usage + setUsage(memoryStatus.dwMemoryLoad); } diff --git a/ScreenPlaySysInfo/ram.h b/ScreenPlaySysInfo/ram.h index f5fe98ae..b3d554c8 100644 --- a/ScreenPlaySysInfo/ram.h +++ b/ScreenPlaySysInfo/ram.h @@ -2,30 +2,94 @@ #include #include +#include +#ifdef Q_OS_WIN +#include +#endif +#include + class RAM : public QObject { Q_OBJECT + Q_PROPERTY(float usage READ usage NOTIFY usageChanged) + Q_PROPERTY(unsigned long long usedPhysicalMemory READ usedPhysicalMemory NOTIFY usedPhysicalMemoryChanged) + Q_PROPERTY(unsigned long long totalPhysicalMemory READ totalPhysicalMemory NOTIFY totalPhysicalMemoryChanged) + + Q_PROPERTY(unsigned long long usedVirtualMemory READ usedVirtualMemory NOTIFY usedVirtualMemoryChanged) + Q_PROPERTY(unsigned long long totalVirtualMemory READ totalVirtualMemory NOTIFY totalVirtualMemoryChanged) + + Q_PROPERTY(unsigned long long usedPagingMemory READ usedPagingMemory NOTIFY usedPagingMemoryChanged) + Q_PROPERTY(unsigned long long totalPagingMemory READ totalPagingMemory NOTIFY totalPagingMemoryChanged) + public: explicit RAM(QObject* parent = nullptr); + //total memory usage in percent float usage() const { return m_usage; } + //used physical memory in byte + DWORDLONG usedPhysicalMemory() const + { + return m_usedPhysicalMemory; + } + + //total physical memory in byte + DWORDLONG totalPhysicalMemory() const + { + return m_totalPhysicalMemory; + } + + //total virtual memory in byte + DWORDLONG totalVirtualMemory() const + { + return m_totalVirtualMemory; + } + + //used virtual memory in byte + DWORDLONG usedVirtualMemory() const + { + return m_usedVirtualMemory; + } + + //used paging memory in byte + DWORDLONG usedPagingMemory() const + { + return m_usedPagingMemory; + } + + //total paging memory in byte + DWORDLONG totalPagingMemory() const + { + return m_totalPagingMemory; + } + signals: void usageChanged(float usage); -public slots: - void exe(){ - qDebug() << "aa"; - } + void usedPhysicalMemoryChanged(DWORDLONG usedPhysicalMemory); + + void usedVirtualMemoryChanged(DWORDLONG usedVirtualMemory); + + void usedPagingMemoryChanged(DWORDLONG usedPagingMemory); + + + void totalPhysicalMemoryChanged(DWORDLONG totalPhysicalMemory); + + void totalVirtualMemoryChanged(DWORDLONG totalVirtualMemory); + + void totalPagingMemoryChanged(DWORDLONG totalPagingMemory); + +private slots: + void update(); + void setUsage(float usage) { - qWarning("Floating point comparison needs context sanity check"); if (qFuzzyCompare(m_usage, usage)) return; @@ -33,7 +97,71 @@ public slots: emit usageChanged(m_usage); } + void setUsedPhysicalMemory(DWORDLONG usedPhysicalMemory) + { + if(usedPhysicalMemory == m_usedPhysicalMemory) + return; + + m_usedPhysicalMemory = usedPhysicalMemory; + emit usedPhysicalMemoryChanged(m_usedPhysicalMemory); + } + + void setTotalPhysicalMemory(DWORDLONG totalPhysicalMemory) + { + if(totalPhysicalMemory == m_totalPhysicalMemory) + return; + + m_totalPhysicalMemory = totalPhysicalMemory; + emit totalPhysicalMemoryChanged(m_totalPhysicalMemory); + } + + void setUsedVirtualMemory(DWORDLONG usedVirtualMemory) + { + if(usedVirtualMemory == m_usedVirtualMemory) + return; + + m_usedVirtualMemory = usedVirtualMemory; + emit usedVirtualMemoryChanged(m_usedVirtualMemory); + } + + void setTotalVirtualMemory(DWORDLONG totalVirtualMemory) + { + if(totalVirtualMemory == m_totalVirtualMemory) + return; + + m_totalVirtualMemory = totalVirtualMemory; + emit totalVirtualMemoryChanged(m_totalVirtualMemory); + } + + void setUsedPagingMemory(DWORDLONG usedPagingMemory) + { + if(usedPagingMemory == m_usedPagingMemory) + return; + + m_usedPagingMemory = usedPagingMemory; + emit usedPagingMemoryChanged(m_usedPagingMemory); + } + + void setTotalPagingMemory(DWORDLONG totalPagingMemory) + { + if(totalPagingMemory == m_totalPagingMemory) + return; + + m_totalPagingMemory = totalPagingMemory; + emit totalPagingMemoryChanged(m_totalPagingMemory); + } + private: - float m_usage = 42.0f; + float m_usage = -1.f; + DWORDLONG m_usedPhysicalMemory = 0ul; + DWORDLONG m_totalVirtualMemory = 0ul; + DWORDLONG m_totalPhysicalMemory = 0ul; + DWORDLONG m_usedVirtualMemory = 0ul; + DWORDLONG m_usedPagingMemory = 0ul; + DWORDLONG m_totalPagingMemory = 0ul; + + QTimer m_updateTimer; + int m_tickRate = 1000; + };