File tree Expand file tree Collapse file tree 3 files changed +49
-28
lines changed
Expand file tree Collapse file tree 3 files changed +49
-28
lines changed Original file line number Diff line number Diff line change 1- #include " stdafx.h"
1+ #include " stdafx.h"
22#include " DiskUsage.h"
33#include < algorithm>
44#include < cmath>
@@ -9,7 +9,7 @@ CPdhDiskUsage::CPdhDiskUsage()
99 m_isAvailable = Initialize ();
1010 if (m_isAvailable)
1111 {
12- // 预热:触发PDH内部初始化(首次QueryValues会填充实例列表)
12+ // 预热:触发PDH内部初始化(首次QueryValues会填充实例列表)
1313 std::vector<CounterValueItem> dummy;
1414 QueryValues (dummy);
1515 ExtractDiskNames ();
@@ -37,17 +37,17 @@ void CPdhDiskUsage::ExtractDiskNames()
3737
3838int CPdhDiskUsage::CalculateUtilization (double idleTime) const
3939{
40- // 关键处理:NVMe/RAID等多队列磁盘的空闲时间可能 >100%
41- // 例如: 4队列磁盘空闲时间=400% → 实际空闲=100% → 利用率=0%
40+ // 关键处理:NVMe/RAID等多队列磁盘的空闲时间可能 >100%
41+ // 例如: 4队列磁盘空闲时间=400% → 实际空闲=100% → 利用率=0%
4242 if (idleTime > 100.0 )
4343 idleTime = 100.0 ;
4444
45- // 确保范围在0-100
45+ // 确保范围在0-100
4646 idleTime = (std::max)(0.0 , (std::min)(100.0 , idleTime));
4747
48- // 利用率 = 100% - 空闲时间
48+ // 利用率 = 100% - 空闲时间
4949 double utilization = 100.0 - idleTime;
50- return static_cast <int >(utilization + 0.5 ); // 四舍五入
50+ return static_cast <int >(utilization + 0.5 ); // 四舍五入
5151}
5252
5353bool CPdhDiskUsage::GetDiskUsage (int diskIndex, int & usage)
@@ -68,3 +68,17 @@ bool CPdhDiskUsage::GetDiskUsage(int diskIndex, int& usage)
6868 return false ;
6969
7070}
71+
72+ int CPdhDiskUsage::FindDiskIndex (const std::wstring diskName)
73+ {
74+ int disk_index = -1 ;
75+ for (int i = 0 ; i < static_cast <int >(m_diskNames.size ()); i++)
76+ {
77+ if (diskName == m_diskNames[i].GetString ())
78+ {
79+ disk_index = i;
80+ break ;
81+ }
82+ }
83+ return disk_index;
84+ }
Original file line number Diff line number Diff line change 1- #pragma once
1+ #pragma once
22#include " PdhQuery.h"
33
44class CPdhDiskUsage : public CPdhQuery
@@ -7,25 +7,28 @@ class CPdhDiskUsage : public CPdhQuery
77 CPdhDiskUsage ();
88 ~CPdhDiskUsage ();
99
10- // 获取指定物理磁盘的利用率(0-100)
11- // diskIndex: 0=第一个物理磁盘, 1=第二个...
12- // 返回值: true=成功, false=失败(首次调用通常失败,需间隔200ms+重试)
10+ // 获取指定物理磁盘的利用率(0-100)
11+ // diskIndex: 0=第一个物理磁盘, 1=第二个...
12+ // 返回值: true=成功, false=失败(首次调用通常失败,需间隔200ms+重试)
1313 bool GetDiskUsage (int diskIndex, /* out*/ int & usage);
1414
15- // 获取物理磁盘名称列表
15+ // 获取物理磁盘名称列表
1616 const std::vector<CString>& GetDiskNames () const { return m_diskNames; }
1717
18- // 检查磁盘监控是否可用
18+ // 根据名称查找一个硬盘的序号
19+ int FindDiskIndex (const std::wstring diskName);
20+
21+ // 检查磁盘监控是否可用
1922 bool IsAvailable () const { return m_isAvailable; }
2023
2124private:
22- // 从计数器实例提取磁盘名称
25+ // 从计数器实例提取磁盘名称
2326 void ExtractDiskNames ();
2427
25- // 处理空闲时间
28+ // 处理空闲时间
2629 int CalculateUtilization (double idleTime) const ;
2730
2831private:
2932 bool m_isAvailable{ false };
30- std::vector<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
33+ std::vector<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
3134};
Original file line number Diff line number Diff line change @@ -1388,21 +1388,25 @@ void CTrafficMonitorDlg::DoMonitorAcquisition()
13881388 // 获取硬盘利用率
13891389 if (lite_version /* || is_arm64ec*/ || !theApp.m_general_data .IsHardwareEnable (HI_HDD))
13901390 {
1391- const auto & disk_names = m_disk_usage_helper.GetDiskNames ( );
1392- int disk_index = - 1 ;
1393- for ( int i = 0 ; i < static_cast < int >(disk_names. size ()); i++ )
1391+ int disk_index = m_disk_usage_helper.FindDiskIndex (theApp. m_general_data . hard_disk_name );
1392+ // 没有找到要监控的硬盘时默认使用总体利用率
1393+ if (disk_index < 0 )
13941394 {
1395- if (theApp.m_general_data .hard_disk_name == disk_names[i].GetString ())
1395+ disk_index = m_disk_usage_helper.FindDiskIndex (L" _Total" );
1396+ if (disk_index >= 0 )
13961397 {
1397- disk_index = i;
1398- break ;
1398+ theApp.m_general_data .hard_disk_name = L" _Total" ;
1399+ }
1400+ // 仍然没有找到使用第1块硬盘
1401+ else
1402+ {
1403+ const auto & disk_names = m_disk_usage_helper.GetDiskNames ();
1404+ if (!disk_names.empty ())
1405+ {
1406+ disk_index = 0 ;
1407+ theApp.m_general_data .hard_disk_name = disk_names.front ();
1408+ }
13991409 }
1400- }
1401- // 没有找到要监控的硬盘时默认使用第1个
1402- if (disk_index < 0 && !disk_names.empty ())
1403- {
1404- disk_index = 0 ;
1405- theApp.m_general_data .hard_disk_name = disk_names.front ();
14061410 }
14071411 if (m_disk_usage_helper.GetDiskUsage (disk_index, theApp.m_hdd_usage ))
14081412 m_get_disk_usage_by_pdh = true ;
You can’t perform that action at this time.
0 commit comments