现场查找程序崩溃问题1

This commit is contained in:
2026-05-14 11:07:57 +08:00
parent 4cdda056b4
commit 1dfcf5f77a
4 changed files with 90 additions and 28 deletions

View File

@@ -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; }
/// <summary>
/// 读写锁,用于保护 ListCanDbcModel 的并发访问
/// 支持多个读取操作同时进行,写入操作独占
/// </summary>
private readonly ReaderWriterLockSlim _dbcModelLock = new ReaderWriterLockSlim();
/// <summary>
/// 实例化函数
/// </summary>
@@ -56,17 +63,25 @@ namespace CapMachine.Wpf.Services
/// </summary>
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();
}
}
/// <summary>
@@ -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;
}