Skip to content

Commit dd187f6

Browse files
committed
使用pdh获取硬盘利用率时,默认显示总体利用率
1 parent 6b1062b commit dd187f6

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

TrafficMonitor/PdhHardwareQuery/DiskUsage.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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

3838
int 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

5353
bool 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+
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22
#include "PdhQuery.h"
33

44
class 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

2124
private:
22-
// 从计数器实例提取磁盘名称
25+
// 从计数器实例提取磁盘名称
2326
void ExtractDiskNames();
2427

25-
// 处理空闲时间
28+
// 处理空闲时间
2629
int CalculateUtilization(double idleTime) const;
2730

2831
private:
2932
bool m_isAvailable{ false };
30-
std::vector<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
33+
std::vector<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
3134
};

TrafficMonitor/TrafficMonitorDlg.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff 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;

0 commit comments

Comments
 (0)