mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Merge pull request #82 from ZimM-LostPolygon/gpu-temperature
fix: improved GPU temperature reliability
This commit is contained in:
@@ -19,14 +19,12 @@ public class NvidiaGpuTemperatureProvider : IGpuTemperatureProvider {
|
|||||||
if (!IsValid)
|
if (!IsValid)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
PhysicalGPU internalGpu = _internalGpu!;
|
||||||
IThermalSensor? gpuSensor =
|
IThermalSensor? gpuSensor =
|
||||||
GPUApi.GetThermalSettings(_internalGpu!.Handle).Sensors
|
GPUApi.GetThermalSettings(internalGpu.Handle).Sensors
|
||||||
.FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU);
|
.FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU);
|
||||||
|
|
||||||
if (gpuSensor == null)
|
return gpuSensor?.CurrentTemperature;
|
||||||
return null;
|
|
||||||
|
|
||||||
return gpuSensor.CurrentTemperature;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
|
|||||||
@@ -40,19 +40,28 @@ public class HardwareMonitor
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
|
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
|
||||||
} catch (Exception ex)
|
} catch (Exception ex) {
|
||||||
{
|
gpuTemp = null;
|
||||||
Logger.WriteLine("Failed reading GPU temp");
|
Logger.WriteLine("Failed reading GPU temp");
|
||||||
Logger.WriteLine(ex.ToString());
|
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() {
|
public static void RecreateGpuTemperatureProvider() {
|
||||||
try {
|
try {
|
||||||
if (GpuTemperatureProvider != null) {
|
GpuTemperatureProvider?.Dispose();
|
||||||
GpuTemperatureProvider.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect valid GPU temperature provider.
|
// Detect valid GPU temperature provider.
|
||||||
// We start with NVIDIA because there's always at least an integrated AMD GPU
|
// We start with NVIDIA because there's always at least an integrated AMD GPU
|
||||||
@@ -73,7 +82,7 @@ public class HardwareMonitor
|
|||||||
|
|
||||||
GpuTemperatureProvider = null;
|
GpuTemperatureProvider = null;
|
||||||
} finally {
|
} finally {
|
||||||
Debug.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}");
|
Logger.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
Program.cs
12
Program.cs
@@ -8,6 +8,8 @@ public static class Logger
|
|||||||
{
|
{
|
||||||
public static void WriteLine(string logMessage)
|
public static void WriteLine(string logMessage)
|
||||||
{
|
{
|
||||||
|
Debug.WriteLine(logMessage);
|
||||||
|
|
||||||
var appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
|
var appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
|
||||||
var logFile = appPath + "\\log.txt";
|
var logFile = appPath + "\\log.txt";
|
||||||
|
|
||||||
@@ -109,6 +111,7 @@ namespace GHelper
|
|||||||
settingsForm.SetStartupCheck(Startup.IsScheduled());
|
settingsForm.SetStartupCheck(Startup.IsScheduled());
|
||||||
|
|
||||||
SetAutoModes();
|
SetAutoModes();
|
||||||
|
HardwareMonitor.RecreateGpuTemperatureProvider();
|
||||||
|
|
||||||
// Subscribing for native power change events
|
// Subscribing for native power change events
|
||||||
|
|
||||||
@@ -205,15 +208,6 @@ namespace GHelper
|
|||||||
settingsForm.AutoGPUMode(isPlugged);
|
settingsForm.AutoGPUMode(isPlugged);
|
||||||
|
|
||||||
settingsForm.SetMatrix(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)
|
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
|
||||||
|
|||||||
@@ -935,6 +935,7 @@ namespace GHelper
|
|||||||
Program.settingsForm.BeginInvoke(delegate
|
Program.settingsForm.BeginInvoke(delegate
|
||||||
{
|
{
|
||||||
InitGPUMode();
|
InitGPUMode();
|
||||||
|
HardwareMonitor.RecreateGpuTemperatureProviderWithRetry();
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
AutoScreen(SystemInformation.PowerStatus.PowerLineStatus);
|
AutoScreen(SystemInformation.PowerStatus.PowerLineStatus);
|
||||||
});
|
});
|
||||||
@@ -987,9 +988,12 @@ namespace GHelper
|
|||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed)
|
if (changed) {
|
||||||
Program.config.setConfig("gpu_mode", GPUMode);
|
Program.config.setConfig("gpu_mode", GPUMode);
|
||||||
|
|
||||||
|
HardwareMonitor.RecreateGpuTemperatureProviderWithRetry();
|
||||||
|
}
|
||||||
|
|
||||||
if (restart)
|
if (restart)
|
||||||
{
|
{
|
||||||
VisualiseGPUMode(GPUMode);
|
VisualiseGPUMode(GPUMode);
|
||||||
|
|||||||
Reference in New Issue
Block a user