mirror of
https://github.com/zhongyang219/TrafficMonitor.git
synced 2026-10-17 05:07:21 +08:00
实现使用PDH获取硬盘利用率,Lite版增加显示硬盘利用率的功能
This commit is contained in:
@@ -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
|
||||
};
|
||||
|
||||
//显示的项目
|
||||
|
||||
@@ -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返回顺序
|
||||
};
|
||||
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user