fix: nvidia driver version check

master
tongg 5 months ago
parent 46661419b0
commit e2569f11e5
  1. 7
      App.config
  2. 95
      LoginWindow.xaml.cs
  3. 1
      SparkClient.csproj

@ -8,12 +8,15 @@
<add key="ImageFileBasePath" value="D:\diamond_images"/> <add key="ImageFileBasePath" value="D:\diamond_images"/>
<!-- 算法失败时,历史图片保存文件夹路径 --> <!-- 算法失败时,历史图片保存文件夹路径 -->
<add key="ImageHistoryPath" value="D:\ImageHistory"/> <add key="ImageHistoryPath" value="D:\ImageHistory"/>
<!-- 打印机名称 -->
<add key="PrintName" value="Deli DL-770D"/> <add key="PrintName" value="Deli DL-770D"/>
<!-- 打印纸张内容宽比 -->
<add key="PrintWidth" value="400"/> <add key="PrintWidth" value="400"/>
<!-- 打印纸张内容高比 -->
<add key="PrintHeight" value="300"/> <add key="PrintHeight" value="300"/>
<!-- 检测结果默认DS -->
<add key="DSSet" value="NA"/> <add key="DSSet" value="NA"/>
<!-- 检测预估耗时:毫秒 -->
<add key="ProgressTime" value="50000"/> <add key="ProgressTime" value="50000"/>
</appSettings> </appSettings>

@ -3,6 +3,7 @@ using SparkClient.Model.Helper;
using SparkClient.ViewModel.Configuration.SettingsPages; using SparkClient.ViewModel.Configuration.SettingsPages;
using System.Data; using System.Data;
using System.Diagnostics; using System.Diagnostics;
using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using Microsoft.Win32; using Microsoft.Win32;
@ -27,33 +28,93 @@ public partial class LoginWindow : Window
private void checkNvidia() private void checkNvidia()
{ {
string nvidiaVersion = ""; string nvidiaVersion = "";
const string regPath = @"SOFTWARE\NVIDIA Corporation\Global\NVSMI"; using (Process process = new Process())
const string keyName = "DisplayDriverVersion";
try
{ {
// 针对 64 位系统访问注册表 process.StartInfo.FileName = "nvidia-smi";
using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) process.StartInfo.Arguments = "--query-gpu=driver_version --format=csv,noheader,nounits";
using (var key = baseKey.OpenSubKey(regPath)) process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
// 使用StringBuilder来捕获输出和错误信息
StringBuilder outputBuilder = new StringBuilder();
StringBuilder errorBuilder = new StringBuilder();
process.OutputDataReceived += (sender, e) =>
{ {
if (key != null) if (e.Data != null)
outputBuilder.AppendLine(e.Data);
};
process.ErrorDataReceived += (sender, e) =>
{
if (e.Data != null)
errorBuilder.AppendLine(e.Data);
};
process.Start();
// 开始异步读取输出和错误流
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
// 获取完整的输出和错误信息
string outputMsg = outputBuilder.ToString();
string errorMsg = errorBuilder.ToString();
nvidiaVersion = (string.IsNullOrWhiteSpace(errorMsg)?outputMsg:errorMsg).Trim();
if (process.ExitCode == 0 || !string.IsNullOrWhiteSpace(nvidiaVersion))
{
if (CompareVersions(nvidiaVersion, "528.33") <= 0)
{ {
var value = key.GetValue(keyName)?.ToString(); MessageBox messageBox = new MessageBox();
nvidiaVersion = !string.IsNullOrEmpty(value) ? value : "未找到驱动版本"; messageBox.Show(MultilingualHelper.getString("NotNvidiaVersionLow").Replace("%version", nvidiaVersion));
} }
} }
else
{
MessageBox messageBox = new MessageBox();
messageBox.Show(MultilingualHelper.getString("NotNvidia"));
}
} }
catch (Exception ex) }
public static int CompareVersions(string versionA, string versionB)
{
int[] partsA = ParseVersion(versionA);
int[] partsB = ParseVersion(versionB);
int maxLength = Math.Max(partsA.Length, partsB.Length);
for (int i = 0; i < maxLength; i++)
{ {
nvidiaVersion = ex.Message; int a = (i < partsA.Length) ? partsA[i] : 0;
Logger.Error("Nvidia检测错误:"+ ex); int b = (i < partsB.Length) ? partsB[i] : 0;
if (a != b)
{
return a.CompareTo(b);
}
} }
MessageBox messageBox = new MessageBox(); return 0; // 版本相同
messageBox.Show(nvidiaVersion);
} }
private static int[] ParseVersion(string version)
{
string[] stringParts = version.Split('.');
int[] intParts = new int[stringParts.Length];
for (int i = 0; i < stringParts.Length; i++)
{
if (!int.TryParse(stringParts[i], out int part))
{
return [0, 0, 0];
}
intParts[i] = part;
}
return intParts;
}
private void checkCUDA() private void checkCUDA()
{ {
try try

@ -14,6 +14,7 @@
<Company>北京跃洋新视科技有限公司</Company> <Company>北京跃洋新视科技有限公司</Company>
<AssemblyVersion>1.0.0</AssemblyVersion> <AssemblyVersion>1.0.0</AssemblyVersion>
<FileVersion>1.0.0</FileVersion> <FileVersion>1.0.0</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

Loading…
Cancel
Save