使用pdh获取硬盘利用率时,默认显示总体利用率

This commit is contained in:
zhongyang219
2026-02-12 21:01:11 +08:00
parent 6b1062bff7
commit dd187f6001
3 changed files with 49 additions and 28 deletions
+21 -7
View File
@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "DiskUsage.h"
#include <algorithm>
#include <cmath>
@@ -9,7 +9,7 @@ CPdhDiskUsage::CPdhDiskUsage()
m_isAvailable = Initialize();
if (m_isAvailable)
{
// 预热:触发PDH内部初始化(首次QueryValues会填充实例列表)
// 预热:触发PDH内部初始化(首次QueryValues会填充实例列表)
std::vector<CounterValueItem> 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<int>(utilization + 0.5); // 四舍五入
return static_cast<int>(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<int>(m_diskNames.size()); i++)
{
if (diskName == m_diskNames[i].GetString())
{
disk_index = i;
break;
}
}
return disk_index;
}
+12 -9
View File
@@ -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<CString>& 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<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
std::vector<CString> m_diskNames; // 磁盘名称列表,按PDH返回顺序
};
+16 -12
View File
@@ -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<int>(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;