From dd187f6001b1680f739f7a15566aca5cb162f18f Mon Sep 17 00:00:00 2001 From: zhongyang219 Date: Thu, 12 Feb 2026 21:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8pdh=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=A1=AC=E7=9B=98=E5=88=A9=E7=94=A8=E7=8E=87=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=98=BE=E7=A4=BA=E6=80=BB=E4=BD=93=E5=88=A9?= =?UTF-8?q?=E7=94=A8=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp | 28 ++++++++++++++----- TrafficMonitor/PdhHardwareQuery/DiskUsage.h | 21 ++++++++------ TrafficMonitor/TrafficMonitorDlg.cpp | 28 +++++++++++-------- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp b/TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp index ca2a7c0..b97d27e 100644 --- a/TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp +++ b/TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "DiskUsage.h" #include #include @@ -9,7 +9,7 @@ CPdhDiskUsage::CPdhDiskUsage() m_isAvailable = Initialize(); if (m_isAvailable) { - // Ô¤ÈÈ£º´¥·¢PDHÄÚ²¿³õʼ»¯£¨Ê×´ÎQueryValues»áÌî³äʵÀýÁÐ±í£© + // 预热:触å�‘PDH内部åˆ�始化(首次QueryValues会填充实例列表) std::vector dummy; QueryValues(dummy); ExtractDiskNames(); @@ -37,17 +37,17 @@ void CPdhDiskUsage::ExtractDiskNames() int CPdhDiskUsage::CalculateUtilization(double idleTime) const { - // ¹Ø¼ü´¦Àí£ºNVMe/RAIDµÈ¶à¶ÓÁдÅÅ̵ĿÕÏÐʱ¼ä¿ÉÄÜ >100% - // ÀýÈç: 4¶ÓÁдÅÅÌ¿ÕÏÐʱ¼ä=400% ¡ú ʵ¼Ê¿ÕÏÐ=100% ¡ú ÀûÓÃÂÊ=0% + // 关键处ç�†ï¼šNVMe/RAID等多队列ç£�盘的空闲时间å�¯èƒ½ >100% + // 例如: 4队列ç£�盘空闲时间=400% → 实际空闲=100% → 利用率=0% if (idleTime > 100.0) idleTime = 100.0; - // È·±£·¶Î§ÔÚ0-100 + // ç¡®ä¿�范围在0-100 idleTime = (std::max)(0.0, (std::min)(100.0, idleTime)); - // ÀûÓÃÂÊ = 100% - ¿ÕÏÐʱ¼ä + // 利用率 = 100% - 空闲时间 double utilization = 100.0 - idleTime; - return static_cast(utilization + 0.5); // ËÄÉáÎåÈë + return static_cast(utilization + 0.5); // å››èˆ�五入 } bool CPdhDiskUsage::GetDiskUsage(int diskIndex, int& usage) @@ -68,3 +68,17 @@ bool CPdhDiskUsage::GetDiskUsage(int diskIndex, int& usage) return false; } + +int CPdhDiskUsage::FindDiskIndex(const std::wstring diskName) +{ + int disk_index = -1; + for (int i = 0; i < static_cast(m_diskNames.size()); i++) + { + if (diskName == m_diskNames[i].GetString()) + { + disk_index = i; + break; + } + } + return disk_index; +} diff --git a/TrafficMonitor/PdhHardwareQuery/DiskUsage.h b/TrafficMonitor/PdhHardwareQuery/DiskUsage.h index 1a3f681..6b614da 100644 --- a/TrafficMonitor/PdhHardwareQuery/DiskUsage.h +++ b/TrafficMonitor/PdhHardwareQuery/DiskUsage.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "PdhQuery.h" class CPdhDiskUsage : public CPdhQuery @@ -7,25 +7,28 @@ public: CPdhDiskUsage(); ~CPdhDiskUsage(); - // »ñȡָ¶¨ÎïÀí´ÅÅ̵ÄÀûÓÃÂÊ£¨0-100£© - // diskIndex: 0=µÚÒ»¸öÎïÀí´ÅÅÌ, 1=µÚ¶þ¸ö... - // ·µ»ØÖµ: true=³É¹¦, false=ʧ°Ü£¨Ê״ε÷ÓÃͨ³£Ê§°Ü£¬Ðè¼ä¸ô200ms+ÖØÊÔ£© + // 获å�–指定物ç�†ç£�盘的利用率(0-100) + // diskIndex: 0=第一个物ç�†ç£�盘, 1=第二个... + // 返回值: true=æˆ�功, false=失败(首次调用通常失败,需间隔200ms+é‡�试) bool GetDiskUsage(int diskIndex, /*out*/ int& usage); - // »ñÈ¡ÎïÀí´ÅÅÌÃû³ÆÁбí + // 获å�–物ç�†ç£�盘å��称列表 const std::vector& GetDiskNames() const { return m_diskNames; } - // ¼ì²é´ÅÅÌ¼à¿ØÊÇ·ñ¿ÉÓà + //æ ¹æ�®å��称查找一个硬盘的åº�å�· + int FindDiskIndex(const std::wstring diskName); + + // 检查ç£�盘监控是å�¦å�¯ç”¨ bool IsAvailable() const { return m_isAvailable; } private: - // ´Ó¼ÆÊýÆ÷ʵÀýÌáÈ¡´ÅÅÌÃû³Æ + // 从计数器实例æ��å�–ç£�盘å��ç§° void ExtractDiskNames(); - // ´¦Àí¿ÕÏÐʱ¼ä + // 处ç�†ç©ºé—²æ—¶é—´ int CalculateUtilization(double idleTime) const; private: bool m_isAvailable{ false }; - std::vector m_diskNames; // ´ÅÅÌÃû³ÆÁÐ±í£¬°´PDH·µ»ØË³Ðò + std::vector m_diskNames; // ç£�盘å��称列表,按PDH返回顺åº� }; \ No newline at end of file diff --git a/TrafficMonitor/TrafficMonitorDlg.cpp b/TrafficMonitor/TrafficMonitorDlg.cpp index 501644d..eb7a547 100644 --- a/TrafficMonitor/TrafficMonitorDlg.cpp +++ b/TrafficMonitor/TrafficMonitorDlg.cpp @@ -1388,21 +1388,25 @@ void CTrafficMonitorDlg::DoMonitorAcquisition() //获å�–硬盘利用率 if (lite_version /*|| is_arm64ec*/ || !theApp.m_general_data.IsHardwareEnable(HI_HDD)) { - const auto& disk_names = m_disk_usage_helper.GetDiskNames(); - int disk_index = -1; - for (int i = 0; i < static_cast(disk_names.size()); i++) + int disk_index = m_disk_usage_helper.FindDiskIndex(theApp.m_general_data.hard_disk_name); + //没有找到è¦�监控的硬盘时默认使用总体利用率 + if (disk_index < 0) { - if (theApp.m_general_data.hard_disk_name == disk_names[i].GetString()) + disk_index = m_disk_usage_helper.FindDiskIndex(L"_Total"); + if (disk_index >= 0) { - disk_index = i; - break; + theApp.m_general_data.hard_disk_name = L"_Total"; + } + //ä»�然没有找到使用第1å�—硬盘 + else + { + const auto& disk_names = m_disk_usage_helper.GetDiskNames(); + if (!disk_names.empty()) + { + disk_index = 0; + theApp.m_general_data.hard_disk_name = disk_names.front(); + } } - } - //没有找到è¦�监控的硬盘时默认使用第1个 - if (disk_index < 0 && !disk_names.empty()) - { - disk_index = 0; - theApp.m_general_data.hard_disk_name = disk_names.front(); } if (m_disk_usage_helper.GetDiskUsage(disk_index, theApp.m_hdd_usage)) m_get_disk_usage_by_pdh = true;