WIP - optimizing start times

This commit is contained in:
2026-05-30 15:11:32 -05:00
parent 45bf81ebfa
commit b744f70b0b
8 changed files with 795 additions and 98 deletions
@@ -3,7 +3,9 @@
// Copyright (C) LibreHardwareMonitor and Contributors.
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using LibreHardwareMonitor.Hardware;
using LibreHardwareMonitor.Hardware.Storage;
@@ -13,13 +15,21 @@ namespace LibreHardwareMonitor.Windows.WinUI.Services;
public sealed class HardwareMonitorService : IDisposable
{
private const string DeferDimmDetectionSetting = "memory.deferDimmDetection";
private const string DeferCpuInitialUpdateSetting = "cpu.deferInitialUpdate";
private const string DeferNetworkDetectionSetting = "network.deferDetection";
private const string DeferNvidiaDetectionSetting = "nvidia.deferDetection";
private const string DeferStorageDetectionSetting = "storage.deferDetection";
private readonly object _updateLock = new();
private readonly UpdateVisitor _updateVisitor = new();
private bool _isOpen;
private int _treeRebuildQueued;
public HardwareMonitorService(AppSettings settings)
{
Settings = settings;
ApplyWinUiHardwareDefaults();
Computer = new Computer(settings);
Computer.HardwareAdded += HardwareChanged;
Computer.HardwareRemoved += HardwareChanged;
@@ -181,6 +191,24 @@ public sealed class HardwareMonitorService : IDisposable
ForceDriveWakeup = Settings.GetValue("forceDriveWakeupItem", false);
}
private void ApplyWinUiHardwareDefaults()
{
if (!Settings.Contains(DeferDimmDetectionSetting))
Settings.SetValue(DeferDimmDetectionSetting, true);
if (!Settings.Contains(DeferCpuInitialUpdateSetting))
Settings.SetValue(DeferCpuInitialUpdateSetting, true);
if (!Settings.Contains(DeferNvidiaDetectionSetting))
Settings.SetValue(DeferNvidiaDetectionSetting, true);
if (!Settings.Contains(DeferStorageDetectionSetting))
Settings.SetValue(DeferStorageDetectionSetting, true);
if (!Settings.Contains(DeferNetworkDetectionSetting))
Settings.SetValue(DeferNetworkDetectionSetting, true);
}
private void SetHardwareEnabled(string settingName, bool value, Action<bool> setter)
{
setter(value);
@@ -192,6 +220,31 @@ public sealed class HardwareMonitorService : IDisposable
private void HardwareChanged(IHardware hardware)
{
if (_isOpen)
RebuildTree();
QueueTreeRebuild();
}
private void QueueTreeRebuild()
{
if (Interlocked.Exchange(ref _treeRebuildQueued, 1) == 1)
return;
_ = Task.Run(async () =>
{
try
{
await Task.Delay(100).ConfigureAwait(false);
if (_isOpen)
RebuildTree();
}
catch (Exception ex)
{
Debug.WriteLine($"Hardware tree rebuild failed: {ex}");
}
finally
{
Interlocked.Exchange(ref _treeRebuildQueued, 0);
}
});
}
}