From 7bfd10c65df5e25d79d3f727ef302aa73a843abb Mon Sep 17 00:00:00 2001 From: Serhii Yolkin Date: Mon, 13 Mar 2023 22:45:12 +0100 Subject: [PATCH] fix: improved GPU temperature reliability --- Gpu/NvidiaGpuTemperatureProvider.cs | 8 +++----- HardwareMonitor.cs | 23 ++++++++++++++++------- Program.cs | 12 +++--------- Settings.cs | 6 +++++- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/Gpu/NvidiaGpuTemperatureProvider.cs b/Gpu/NvidiaGpuTemperatureProvider.cs index 91e3ff7d..2add0c24 100644 --- a/Gpu/NvidiaGpuTemperatureProvider.cs +++ b/Gpu/NvidiaGpuTemperatureProvider.cs @@ -19,14 +19,12 @@ public class NvidiaGpuTemperatureProvider : IGpuTemperatureProvider { if (!IsValid) return null; + PhysicalGPU internalGpu = _internalGpu!; IThermalSensor? gpuSensor = - GPUApi.GetThermalSettings(_internalGpu!.Handle).Sensors + GPUApi.GetThermalSettings(internalGpu.Handle).Sensors .FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU); - if (gpuSensor == null) - return null; - - return gpuSensor.CurrentTemperature; + return gpuSensor?.CurrentTemperature; } public void Dispose() { diff --git a/HardwareMonitor.cs b/HardwareMonitor.cs index e6c4f9f0..dae5b976 100644 --- a/HardwareMonitor.cs +++ b/HardwareMonitor.cs @@ -40,20 +40,29 @@ public class HardwareMonitor try { gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature(); - } catch (Exception ex) - { + } catch (Exception ex) { + gpuTemp = null; Logger.WriteLine("Failed reading GPU temp"); Logger.WriteLine(ex.ToString()); } } + public static void RecreateGpuTemperatureProviderWithRetry() { + RecreateGpuTemperatureProvider(); + + // Re-enabling the discrete GPU takes a bit of time, + // so a simple workaround is to refresh again after that happens + Task.Run(async () => { + await Task.Delay(TimeSpan.FromSeconds(3)); + RecreateGpuTemperatureProvider(); + }); + } + public static void RecreateGpuTemperatureProvider() { try { - if (GpuTemperatureProvider != null) { - GpuTemperatureProvider.Dispose(); - } - + GpuTemperatureProvider?.Dispose(); + // Detect valid GPU temperature provider. // We start with NVIDIA because there's always at least an integrated AMD GPU IGpuTemperatureProvider gpuTemperatureProvider = new NvidiaGpuTemperatureProvider(); @@ -73,7 +82,7 @@ public class HardwareMonitor GpuTemperatureProvider = null; } finally { - Debug.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}"); + Logger.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}"); } } } diff --git a/Program.cs b/Program.cs index 1a10dc4e..e49dcf63 100644 --- a/Program.cs +++ b/Program.cs @@ -8,6 +8,8 @@ public static class Logger { public static void WriteLine(string logMessage) { + Debug.WriteLine(logMessage); + var appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper"; var logFile = appPath + "\\log.txt"; @@ -109,6 +111,7 @@ namespace GHelper settingsForm.SetStartupCheck(Startup.IsScheduled()); SetAutoModes(); + HardwareMonitor.RecreateGpuTemperatureProvider(); // Subscribing for native power change events @@ -205,15 +208,6 @@ namespace GHelper settingsForm.AutoGPUMode(isPlugged); settingsForm.SetMatrix(isPlugged); - - HardwareMonitor.RecreateGpuTemperatureProvider(); - - // Re-enabling the discrete GPU takes a bit of time, - // so a simple workaround is to refresh again after that happens - Task.Run(async () => { - await Task.Delay(TimeSpan.FromSeconds(3)); - HardwareMonitor.RecreateGpuTemperatureProvider(); - }); } private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) diff --git a/Settings.cs b/Settings.cs index ff0ccaf4..84d8ef80 100644 --- a/Settings.cs +++ b/Settings.cs @@ -935,6 +935,7 @@ namespace GHelper Program.settingsForm.BeginInvoke(delegate { InitGPUMode(); + HardwareMonitor.RecreateGpuTemperatureProviderWithRetry(); Thread.Sleep(500); AutoScreen(SystemInformation.PowerStatus.PowerLineStatus); }); @@ -987,8 +988,11 @@ namespace GHelper changed = true; } - if (changed) + if (changed) { Program.config.setConfig("gpu_mode", GPUMode); + + HardwareMonitor.RecreateGpuTemperatureProviderWithRetry(); + } if (restart) {