实现使用PDH获取硬盘利用率,Lite版增加显示硬盘利用率的功能

This commit is contained in:
zhongyang219
2026-02-10 22:23:36 +08:00
parent 1563301a57
commit 6f7ebcf1a4
14 changed files with 176 additions and 30 deletions
+2 -2
View File
@@ -24,9 +24,9 @@ const std::set<DisplayItem> AllDisplayItems
{
TDI_UP, TDI_DOWN, TDI_CPU, TDI_MEMORY, TDI_GPU_USAGE
#ifndef WITHOUT_TEMPERATURE
, TDI_CPU_TEMP, TDI_GPU_TEMP, TDI_HDD_TEMP, TDI_MAIN_BOARD_TEMP, TDI_HDD_USAGE
, TDI_CPU_TEMP, TDI_GPU_TEMP, TDI_HDD_TEMP, TDI_MAIN_BOARD_TEMP
#endif
,TDI_CPU_FREQ, TDI_TOTAL_SPEED, TDI_TODAY_TRAFFIC
, TDI_HDD_USAGE, TDI_CPU_FREQ, TDI_TOTAL_SPEED, TDI_TODAY_TRAFFIC
};
//显示的项目
+19 -8
View File
@@ -3,6 +3,7 @@
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "TrafficMonitorDlg.h"
#include "GeneralSettingsDlg.h"
#include "PluginManagerDlg.h"
#include "SelectConnectionsDlg.h"
@@ -38,7 +39,6 @@ void CGeneralSettingsDlg::CheckTaskbarDisplayItem()
if (!theApp.m_general_data.IsHardwareEnable(HI_HDD))
{
theApp.m_taskbar_data.display_item.Remove(TDI_HDD_TEMP);
theApp.m_taskbar_data.display_item.Remove(TDI_HDD_USAGE);
}
if (!theApp.m_general_data.IsHardwareEnable(HI_MBD))
theApp.m_taskbar_data.display_item.Remove(TDI_MAIN_BOARD_TEMP);
@@ -199,7 +199,7 @@ void CGeneralSettingsDlg::SetControlEnable()
m_hdd_temp_tip_edit.EnableWindow(m_data.hdd_temp_tip.enable);
m_mbd_temp_tip_edit.EnableWindow(m_data.mainboard_temp_tip.enable);
m_hard_disk_combo.EnableWindow(m_data.IsHardwareEnable(HI_HDD));
//m_hard_disk_combo.EnableWindow(m_data.IsHardwareEnable(HI_HDD));
m_select_cpu_combo.EnableWindow(m_data.IsHardwareEnable(HI_CPU));
EnableDlgCtrl(IDC_SELECT_CONNECTIONS_BUTTON, !m_data.show_all_interface);
@@ -358,6 +358,14 @@ BOOL CGeneralSettingsDlg::OnInitDialog()
m_monitor_time_span_ori = m_data.monitor_time_span;
m_update_source_ori = m_data.update_source;
if (CTrafficMonitorDlg::Instance()->IsGetDiskUsageByPdh())
{
const auto& disk_names = CTrafficMonitorDlg::Instance()->GetPdhDiskUsageHelper().GetDiskNames();
for (const auto& hdd_name : disk_names)
m_hard_disk_combo.AddString(hdd_name);
int cur_index = m_hard_disk_combo.FindString(-1, m_data.hard_disk_name.c_str());
m_hard_disk_combo.SetCurSel(cur_index);
}
#ifndef WITHOUT_TEMPERATURE
//初始化硬件监控Check box
CheckDlgButton(IDC_CPU_CHECK, m_data.IsHardwareEnable(HI_CPU));
@@ -369,10 +377,13 @@ BOOL CGeneralSettingsDlg::OnInitDialog()
{
CSingleLock sync(&theApp.m_minitor_lib_critical, TRUE);
//初始化选择硬盘下拉列表
for (const auto& hdd_item : theApp.m_pMonitor->AllHDDTemperature())
m_hard_disk_combo.AddString(hdd_item.first.c_str());
int cur_index = m_hard_disk_combo.FindString(-1, m_data.hard_disk_name.c_str());
m_hard_disk_combo.SetCurSel(cur_index);
if (!CTrafficMonitorDlg::Instance()->IsGetDiskUsageByPdh())
{
for (const auto& hdd_item : theApp.m_pMonitor->AllHDDTemperature())
m_hard_disk_combo.AddString(hdd_item.first.c_str());
int cur_index = m_hard_disk_combo.FindString(-1, m_data.hard_disk_name.c_str());
m_hard_disk_combo.SetCurSel(cur_index);
}
//初始化选择CPU下拉列表
m_select_cpu_combo.AddString(CCommon::LoadText(IDS_AVREAGE_TEMPERATURE));
for (const auto& cpu_item : theApp.m_pMonitor->AllCpuTemperature())
@@ -398,13 +409,13 @@ BOOL CGeneralSettingsDlg::OnInitDialog()
EnableDlgCtrl(IDC_GPU_CHECK, false);
EnableDlgCtrl(IDC_HDD_CHECK, false);
EnableDlgCtrl(IDC_MBD_CHECK, false);
EnableDlgCtrl(IDC_SELECT_HARD_DISK_COMBO, false);
//EnableDlgCtrl(IDC_SELECT_HARD_DISK_COMBO, false);
EnableDlgCtrl(IDC_SELECT_CPU_COMBO, false);
EnableDlgCtrl(IDC_CPU_TEMP_STATIC, false);
EnableDlgCtrl(IDC_GPU_TEMP_STATIC, false);
EnableDlgCtrl(IDC_HDD_STATIC, false);
EnableDlgCtrl(IDC_MBD_TEMP_STATIC, false);
EnableDlgCtrl(IDC_SELECT_HDD_STATIC, false);
//EnableDlgCtrl(IDC_SELECT_HDD_STATIC, false);
EnableDlgCtrl(IDC_SELECT_CPU_STATIC, false);
EnableDlgCtrl(IDC_HARDWARE_MONITOR_STATIC, false);
#endif
@@ -0,0 +1,70 @@
#include "stdafx.h"
#include "DiskUsage.h"
#include <algorithm>
#include <cmath>
CPdhDiskUsage::CPdhDiskUsage()
: CPdhQuery(_T("\\PhysicalDisk(*)\\% Idle Time"))
{
m_isAvailable = Initialize();
if (m_isAvailable)
{
// 预热:触发PDH内部初始化(首次QueryValues会填充实例列表)
std::vector<CounterValueItem> dummy;
QueryValues(dummy);
ExtractDiskNames();
}
}
CPdhDiskUsage::~CPdhDiskUsage()
{
}
void CPdhDiskUsage::ExtractDiskNames()
{
m_diskNames.clear();
std::vector<CounterValueItem> values;
if (!QueryValues(values))
return;
for (const auto& item : values)
{
CString name(item.name.c_str());
m_diskNames.push_back(name);
}
}
int CPdhDiskUsage::CalculateUtilization(double idleTime) const
{
// 关键处理:NVMe/RAID等多队列磁盘的空闲时间可能 >100%
// 例如: 4队列磁盘空闲时间=400% → 实际空闲=100% → 利用率=0%
if (idleTime > 100.0)
idleTime = 100.0;
// 确保范围在0-100
idleTime = (std::max)(0.0, (std::min)(100.0, idleTime));
// 利用率 = 100% - 空闲时间
double utilization = 100.0 - idleTime;
return static_cast<int>(utilization + 0.5); // 四舍五入
}
bool CPdhDiskUsage::GetDiskUsage(int diskIndex, int& usage)
{
usage = 0;
if (!m_isAvailable)
return false;
std::vector<CounterValueItem> values;
if (!QueryValues(values) || values.empty())
return false;
if (diskIndex >= 0 && diskIndex < static_cast<int>(values.size()))
{
usage = CalculateUtilization(values[diskIndex].value);
return true;
}
return false;
}
@@ -0,0 +1,31 @@
#pragma once
#include "PdhQuery.h"
class CPdhDiskUsage : public CPdhQuery
{
public:
CPdhDiskUsage();
~CPdhDiskUsage();
// 获取指定物理磁盘的利用率(0-100)
// diskIndex: 0=第一个物理磁盘, 1=第二个...
// 返回值: true=成功, false=失败(首次调用通常失败,需间隔200ms+重试)
bool GetDiskUsage(int diskIndex, /*out*/ int& usage);
// 获取物理磁盘名称列表
const std::vector<CString>& GetDiskNames() const { return m_diskNames; }
// 检查磁盘监控是否可用
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返回顺序
};
+1 -1
View File
@@ -17,7 +17,7 @@ bool CPdhGPUUsage::GetGpuUsage(int& usage)
{
if (isInitialized)
{
std::vector<ValueItem> valueItems;
std::vector<CounterValueItem> valueItems;
if (QueryValues(valueItems))
{
if (!valueItems.empty())
+3 -2
View File
@@ -62,8 +62,9 @@ bool CPdhQuery::QueryValue(double& value)
return true;
}
bool CPdhQuery::QueryValues(std::vector<ValueItem>& values)
bool CPdhQuery::QueryValues(std::vector<CounterValueItem>& values)
{
values.clear();
if (!isInitialized)
return false;
@@ -84,7 +85,7 @@ bool CPdhQuery::QueryValues(std::vector<ValueItem>& values)
// Loop through the array and print the instance name and counter value.
for (DWORD i = 0; i < dwItemCount; i++)
{
ValueItem value_item;
CounterValueItem value_item;
value_item.name = pItems[i].szName;
value_item.value = pItems[i].FmtValue.doubleValue;
values.push_back(value_item);
+2 -2
View File
@@ -11,12 +11,12 @@ public:
protected:
bool Initialize();
bool QueryValue(double& value);
struct ValueItem
struct CounterValueItem
{
std::wstring name;
double value{};
};
bool QueryValues(std::vector<ValueItem>& values);
bool QueryValues(std::vector<CounterValueItem>& values);
protected:
HQUERY query = nullptr;
+5 -5
View File
@@ -778,13 +778,13 @@ CString CTaskBarDlg::GetMouseTipsInfo()
temp.Format(_T("\r\n%s: %s"), CCommon::LoadText(IDS_MAINBOARD_TEMPERATURE), CCommon::TemperatureToString(theApp.m_main_board_temperature, theApp.m_taskbar_data));
tip_info += temp;
}
if (!IsItemShow(TDI_HDD_USAGE) && theApp.m_hdd_usage >= 0)
{
temp.Format(_T("\r\n%s: %d %%"), CCommon::LoadText(IDS_HDD_USAGE), theApp.m_hdd_usage);
tip_info += temp;
}
}
#endif
if (!IsItemShow(TDI_HDD_USAGE) && theApp.m_hdd_usage >= 0)
{
temp.Format(_T("\r\n%s: %d %%"), CCommon::LoadText(IDS_HDD_USAGE), theApp.m_hdd_usage);
tip_info += temp;
}
//添加插件项目的鼠标提示
tip_info += theApp.GetPlauginTooltipInfo().c_str();
+1 -1
View File
@@ -92,7 +92,7 @@ bool CTaskbarItemOrderHelper::IsItemDisplayed(CommonDisplayItem item)
displayed = false;
if ((item == TDI_GPU_TEMP) && !theApp.m_general_data.IsHardwareEnable(HI_GPU))
displayed = false;
if ((item == TDI_HDD_TEMP || item == TDI_HDD_USAGE) && !theApp.m_general_data.IsHardwareEnable(HI_HDD))
if ((item == TDI_HDD_TEMP) && !theApp.m_general_data.IsHardwareEnable(HI_HDD))
displayed = false;
if (item == TDI_MAIN_BOARD_TEMP && !theApp.m_general_data.IsHardwareEnable(HI_MBD))
displayed = false;
-2
View File
@@ -188,7 +188,6 @@ void CTrafficMonitorApp::LoadConfig()
m_taskbar_data.display_item.Remove(TDI_GPU_TEMP);
m_taskbar_data.display_item.Remove(TDI_HDD_TEMP);
m_taskbar_data.display_item.Remove(TDI_MAIN_BOARD_TEMP);
m_taskbar_data.display_item.Remove(TDI_HDD_USAGE);
#endif
//如果选项设置中关闭了某个硬件监控,则不显示对应的温度监控相关项目
@@ -201,7 +200,6 @@ void CTrafficMonitorApp::LoadConfig()
if (!m_general_data.IsHardwareEnable(HI_HDD))
{
m_taskbar_data.display_item.Remove(TDI_HDD_TEMP);
m_taskbar_data.display_item.Remove(TDI_HDD_USAGE);
}
if (!m_general_data.IsHardwareEnable(HI_MBD))
m_taskbar_data.display_item.Remove(TDI_MAIN_BOARD_TEMP);
+2
View File
@@ -826,6 +826,7 @@
<ClInclude Include="PdhHardwareQuery\CPUUsage.h" />
<ClInclude Include="PdhHardwareQuery\CpuFreq.h" />
<ClInclude Include="PdhHardwareQuery\GpuUsage.h" />
<ClInclude Include="PdhHardwareQuery\DiskUsage.h" />
<ClInclude Include="PdhHardwareQuery\PdhQuery.h" />
<ClInclude Include="PictureStatic.h" />
<ClInclude Include="PluginInfoDlg.h" />
@@ -922,6 +923,7 @@
<ClCompile Include="PdhHardwareQuery\CPUUsage.cpp" />
<ClCompile Include="PdhHardwareQuery\CpuFreq.cpp" />
<ClCompile Include="PdhHardwareQuery\GpuUsage.cpp" />
<ClCompile Include="PdhHardwareQuery\DiskUsage.cpp" />
<ClCompile Include="PdhHardwareQuery\PdhQuery.cpp" />
<ClCompile Include="PictureStatic.cpp" />
<ClCompile Include="PluginInfoDlg.cpp" />
@@ -559,6 +559,9 @@
<ClInclude Include="PdhHardwareQuery\PdhQuery.h">
<Filter>源文件和头文件\公共的类\PdhHardwareQuery</Filter>
</ClInclude>
<ClInclude Include="PdhHardwareQuery\DiskUsage.h">
<Filter>源文件和头文件\公共的类\PdhHardwareQuery</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="StaticEx.cpp">
@@ -834,6 +837,9 @@
<ClCompile Include="PdhHardwareQuery\PdhQuery.cpp">
<Filter>源文件和头文件\公共的类\PdhHardwareQuery</Filter>
</ClCompile>
<ClCompile Include="PdhHardwareQuery\DiskUsage.cpp">
<Filter>源文件和头文件\公共的类\PdhHardwareQuery</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="TrafficMonitor.rc">
+27 -7
View File
@@ -205,13 +205,14 @@ CString CTrafficMonitorDlg::GetMouseTipsInfo()
temp.Format(_T("\r\n%s: %s"), CCommon::LoadText(IDS_MAINBOARD_TEMPERATURE), CCommon::TemperatureToString(theApp.m_main_board_temperature, theApp.m_main_wnd_data));
tip_info += temp;
}
if (theApp.m_general_data.IsHardwareEnable(HI_HDD) && !skin_layout.GetItem(TDI_HDD_USAGE).show && theApp.m_hdd_usage >= 0)
{
temp.Format(_T("\r\n%s: %d %%"), CCommon::LoadText(IDS_HDD_USAGE), theApp.m_hdd_usage);
tip_info += temp;
}
}
#endif
if (!skin_layout.GetItem(TDI_HDD_USAGE).show && theApp.m_hdd_usage >= 0)
{
temp.Format(_T("\r\n%s: %d %%"), CCommon::LoadText(IDS_HDD_USAGE), theApp.m_hdd_usage);
tip_info += temp;
}
//添加插件项目的鼠标提示
tip_info += theApp.GetPlauginTooltipInfo().c_str();
@@ -1354,6 +1355,7 @@ void CTrafficMonitorDlg::DoMonitorAcquisition()
bool cpu_usage_acquired = false;
bool cpu_freq_acquired = false;
bool gpu_usage_acquired = false;
m_get_disk_usage_by_pdh = false;
//获取CPU使用率
if (lite_version || theApp.m_general_data.cpu_usage_acquire_method != GeneralSettingData::CA_HARDWARE_MONITOR || !theApp.m_general_data.IsHardwareEnable(HI_CPU))
@@ -1376,6 +1378,23 @@ void CTrafficMonitorDlg::DoMonitorAcquisition()
gpu_usage_acquired = true;
}
//获取硬盘利用率
if (lite_version /*|| is_arm64ec*/ || !theApp.m_general_data.IsHardwareEnable(HI_HDD))
{
const auto& disk_names = m_disk_usage_helper.GetDiskNames();
int disk_index = 0;
for (int i = 0; i < static_cast<int>(disk_names.size()); i++)
{
if (theApp.m_general_data.hard_disk_name == disk_names[i].GetString())
{
disk_index = i;
break;
}
}
if (m_disk_usage_helper.GetDiskUsage(disk_index, theApp.m_hdd_usage))
m_get_disk_usage_by_pdh = true;
}
//获取内存利用率
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
@@ -1412,7 +1431,8 @@ void CTrafficMonitorDlg::DoMonitorAcquisition()
theApp.m_gpu_temperature = theApp.m_pMonitor->GpuTemperature();
//theApp.m_hdd_temperature = theApp.m_pMonitor->HDDTemperature();
theApp.m_main_board_temperature = theApp.m_pMonitor->MainboardTemperature();
theApp.m_gpu_usage = theApp.m_pMonitor->GpuUsage();
if (!gpu_usage_acquired)
theApp.m_gpu_usage = theApp.m_pMonitor->GpuUsage();
if (!cpu_freq_acquired)
theApp.m_cpu_freq = theApp.m_pMonitor->CpuFreq();
if (!cpu_usage_acquired)
@@ -1455,7 +1475,7 @@ void CTrafficMonitorDlg::DoMonitorAcquisition()
theApp.m_hdd_temperature = -1;
}
//获取硬盘利用率
if (!theApp.m_pMonitor->AllHDDUsage().empty())
if (!m_get_disk_usage_by_pdh && !theApp.m_pMonitor->AllHDDUsage().empty())
{
auto iter = theApp.m_pMonitor->AllHDDUsage().find(theApp.m_general_data.hard_disk_name);
if (iter == theApp.m_pMonitor->AllHDDUsage().end())
+7
View File
@@ -23,6 +23,7 @@
#include "PdhHardwareQuery/CPUUsage.h"
#include "PdhHardwareQuery/CpuFreq.h"
#include "PdhHardwareQuery/GpuUsage.h"
#include "PdhHardwareQuery/DiskUsage.h"
#include "HistoryTrafficFile.h"
// CTrafficMonitorDlg 对话框
@@ -43,6 +44,9 @@ public:
const CSkinFile& GetCurSkin() const { return m_skin; }
CPdhDiskUsage& GetPdhDiskUsageHelper() { return m_disk_usage_helper; }
bool IsGetDiskUsageByPdh() const { return m_get_disk_usage_by_pdh; }
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
@@ -65,6 +69,9 @@ protected:
CCPUUsage m_cpu_usage_helper;
CPdhCpuFreq m_cpu_freq_helper;
CPdhGPUUsage m_gpu_usage_helper;
CPdhDiskUsage m_disk_usage_helper;
bool m_get_disk_usage_by_pdh{};
bool m_first_start{ true }; //初始时为true,在定时器第一次启动后置为flase