From 1dfcf5f77a8200642bc895539a98de657dbfb437 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Thu, 14 May 2026 11:07:57 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E6=9F=A5=E6=89=BE=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=981?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CapMachine.Wpf/App.xaml.cs | 19 +++-- CapMachine.Wpf/CapMachine.Wpf.csproj | 4 + CapMachine.Wpf/Services/CanDriveService.cs | 75 ++++++++++++++----- .../ViewModels/CANConfigViewModel.cs | 20 ++++- 4 files changed, 90 insertions(+), 28 deletions(-) diff --git a/CapMachine.Wpf/App.xaml.cs b/CapMachine.Wpf/App.xaml.cs index b55b988..e93833c 100644 --- a/CapMachine.Wpf/App.xaml.cs +++ b/CapMachine.Wpf/App.xaml.cs @@ -261,7 +261,7 @@ namespace CapMachine.Wpf //给当前的全局异常捕捉服务使用 LogService = ContainerLocator.Container.Resolve(); - LogService.Error("Start-->OnInitialized"); + LogService.Info("程序启动"); base.OnInitialized(); //#endregion @@ -289,7 +289,7 @@ namespace CapMachine.Wpf void App_Exit(object sender, ExitEventArgs e) { //程序退出时需要处理的业务 - LogService.Error("程序退出"); + LogService.Info("App-程序退出"); } @@ -304,12 +304,14 @@ namespace CapMachine.Wpf try { HandleException(e.Exception); - MessageBox.Show("UI线程异常:" + e.Exception.Message); + //MessageBox.Show("UI线程异常:" + e.Exception.Message); + LogService.Error("UI线程异常:" + e.Exception.Message); } catch (Exception ex) { HandleException(ex); - MessageBox.Show("UI线程发生致命错误!"); + //MessageBox.Show("UI线程发生致命错误!"); + LogService.Error("UI线程发生致命错误!"); } finally { @@ -346,8 +348,8 @@ namespace CapMachine.Wpf { sbEx.Append(e.ExceptionObject); } - MessageBox.Show(sbEx.ToString()); - + //MessageBox.Show(sbEx.ToString()); + LogService.Error(sbEx.ToString()); } } catch (Exception ex) @@ -374,7 +376,8 @@ namespace CapMachine.Wpf { HandleException(exception); //task线程内未处理捕获 - MessageBox.Show("Task线程异常:" + e.Exception.Message); + //MessageBox.Show("Task线程异常:" + e.Exception.Message); + LogService.Error($"Task线程异常"); } } catch (Exception ex) @@ -395,7 +398,7 @@ namespace CapMachine.Wpf private void HandleException(Exception ex) { //记录日志 - LogService.Error(ex.ToString()); + LogService.Error($"App捕捉HandleException-{ex.ToString()}"); } diff --git a/CapMachine.Wpf/CapMachine.Wpf.csproj b/CapMachine.Wpf/CapMachine.Wpf.csproj index 61f16c6..87c66e3 100644 --- a/CapMachine.Wpf/CapMachine.Wpf.csproj +++ b/CapMachine.Wpf/CapMachine.Wpf.csproj @@ -15,6 +15,7 @@ + @@ -184,6 +185,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs index a2c6820..1e6e879 100644 --- a/CapMachine.Wpf/Services/CanDriveService.cs +++ b/CapMachine.Wpf/Services/CanDriveService.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace CapMachine.Wpf.Services @@ -21,6 +22,12 @@ namespace CapMachine.Wpf.Services public HighSpeedDataService HighSpeedDataService { get; } + /// + /// 读写锁,用于保护 ListCanDbcModel 的并发访问 + /// 支持多个读取操作同时进行,写入操作独占 + /// + private readonly ReaderWriterLockSlim _dbcModelLock = new ReaderWriterLockSlim(); + /// /// 实例化函数 /// @@ -56,17 +63,25 @@ namespace CapMachine.Wpf.Services /// public void InitCanConfig(CanLinConfigPro selectedCanLinConfigPro) { - //赋值配置数据 - SelectedCanLinConfigPro = selectedCanLinConfigPro; - //为DBC实时数据关联配置的名称 - foreach (var item in SelectedCanLinConfigPro.CanLinConfigContents) + _dbcModelLock.EnterWriteLock(); + try { - var FindData = ListCanDbcModel.FindFirst(a => a.SignalName == item.SignalName); - if (FindData != null) + //赋值配置数据 + SelectedCanLinConfigPro = selectedCanLinConfigPro; + //为DBC实时数据关联配置的名称 + foreach (var item in SelectedCanLinConfigPro.CanLinConfigContents) { - FindData.Name = item.Name; + var FindData = ListCanDbcModel.FindFirst(a => a.SignalName == item.SignalName); + if (FindData != null) + { + FindData.Name = item.Name; + } } } + finally + { + _dbcModelLock.ExitWriteLock(); + } } /// @@ -227,14 +242,22 @@ namespace CapMachine.Wpf.Services { if (ToomossCanDrive.IsCycleRevice == false) { - if (ListCanDbcModel.Count > 0) + _dbcModelLock.EnterReadLock(); + try { - ToomossCanDrive.IsCycleRevice = true; - ToomossCanDrive.StartPrecisionCycleSendMsg(); + if (ListCanDbcModel.Count > 0) + { + ToomossCanDrive.IsCycleRevice = true; + ToomossCanDrive.StartPrecisionCycleSendMsg(); + } + else + { + System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); + } } - else + finally { - System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); + _dbcModelLock.ExitReadLock(); } } else @@ -255,10 +278,18 @@ namespace CapMachine.Wpf.Services { if (!ToomossCanDrive.IsCycleRevice) return 0; - if (ListCanDbcModel.Any(a => a.Name == Name)) + _dbcModelLock.EnterReadLock(); + try { - //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); - return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; + if (ListCanDbcModel.Any(a => a.Name == Name)) + { + //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); + return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; + } + } + finally + { + _dbcModelLock.ExitReadLock(); } return 0; } @@ -274,10 +305,18 @@ namespace CapMachine.Wpf.Services { if (!ToomossCanDrive.IsCycleRevice) return 0; - if (ListCanDbcModel.Any(a => a.Name == Name)) + _dbcModelLock.EnterReadLock(); + try { - //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); - return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; + if (ListCanDbcModel.Any(a => a.Name == Name)) + { + //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); + return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; + } + } + finally + { + _dbcModelLock.ExitReadLock(); } return 0; } diff --git a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs index 900820f..328ca64 100644 --- a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs @@ -382,10 +382,13 @@ namespace CapMachine.Wpf.ViewModels //激活到取消的状态的判断 if (IsCanConfigProActive == true) { + LogService.Info("准备取消激活状态"); //控件的激活 IsCanConfigProActive = !IsCanConfigProActive; + LogService.Info("IsCanConfigProActive已更新"); //控件的激活配置信息 IsCANConfigDatagridActive = !IsCanConfigProActive; + LogService.Info("IsCANConfigDatagridActive已更新"); LogService.Info("CAN配置已取消激活"); return; @@ -395,14 +398,20 @@ namespace CapMachine.Wpf.ViewModels { if (SelectCanLinConfigPro != null) { + LogService.Info($"准备激活配置: {SelectCanLinConfigPro.ConfigName}"); //控件的激活 IsCanConfigProActive = !IsCanConfigProActive; + LogService.Info("IsCanConfigProActive已更新为true"); //控件的激活配置信息 IsCANConfigDatagridActive = !IsCanConfigProActive; + LogService.Info("IsCANConfigDatagridActive已更新"); //当前使用的CAN 配置信息 + LogService.Info("开始调用InitCanConfig"); CanDriveService.InitCanConfig(SelectCanLinConfigPro); + LogService.Info("InitCanConfig完成"); + LogService.Info("开始调用InitLoadCanConfigPro"); InitLoadCanConfigPro(); LogService.Info($"CAN配置激活成功: {SelectCanLinConfigPro.ConfigName}"); } @@ -422,8 +431,15 @@ namespace CapMachine.Wpf.ViewModels LogService.Error($"CAN配置激活操作失败: {ex.Message}\r\n堆栈: {ex.StackTrace}"); System.Windows.MessageBox.Show($"CAN配置激活操作失败: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); //恢复状态 - IsCanConfigProActive = false; - IsCANConfigDatagridActive = true; + try + { + IsCanConfigProActive = false; + IsCANConfigDatagridActive = true; + } + catch (Exception restoreEx) + { + LogService.Error($"恢复状态失败: {restoreEx.Message}"); + } } break; default: