mirror of
https://github.com/zhongyang219/TrafficMonitor.git
synced 2026-10-17 05:07:21 +08:00
使用pdh获取硬盘利用率时,默认显示总体利用率
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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返回顺序
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user