From 771a0e7b6b1276087515bbe94de28358cb92963b Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 04 六月 2026 10:32:27 +0800
Subject: [PATCH] 优化老化;
---
Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs | 105 +++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 98 insertions(+), 7 deletions(-)
diff --git a/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs b/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
index 69b5ee8..fe22156 100644
--- a/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
+++ b/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
@@ -12,6 +12,7 @@
using Plugin.SeqEditor.Util;
using System.Collections.ObjectModel;
using System.IO;
+using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
@@ -60,6 +61,9 @@
private Engine engine;
private SequenceFile sequenceFile;
+
+ public Dictionary<string, SequenceFile> cacheFiles = new Dictionary<string, SequenceFile>();
+
private bool isLoaded;
private ILog log;
public SeqEditor control { get; private set; }
@@ -68,6 +72,15 @@
private HashSet<string> edits = new HashSet<string>();
public Dictionary<Sequence, ObservableCollection<StepUI>> sequenceCache { get; private set; } = new();
+
+ private HashSet<string> indexType = new HashSet<string> {
+ StepTypeStr.PassFailTest,
+ StepTypeStr.NumericLimitTest,
+ StepTypeStr.NI_MultipleNumericLimitTest,
+ StepTypeStr.StringValueTest,
+ StepTypeStr.NI_Wait,
+ StepTypeStr.Action
+ };
public SeqEditorViewModel(SeqEditor control, ILog log)
{
@@ -87,18 +100,23 @@
{
engine.ReleaseSequenceFileEx(sequenceFile);
}
+ foreach (var file in cacheFiles.Values)
+ {
+ engine.ReleaseSequenceFileEx(file);
+ }
engine.ShutDown(true);
// 涓嶅姞寤舵椂浼氬脊绐梞d
- System.Threading.Thread.Sleep(2500);
+ //System.Threading.Thread.Sleep(2500);
}
}
private ObservableCollection<StepUI> LoadSteps(Sequence seq, string group = null)
{
- if (sequenceCache.ContainsKey(seq))
- {
- return sequenceCache[seq];
- }
+ //if (sequenceCache.ContainsKey(seq))
+ //{
+ // return sequenceCache[seq];
+ //}
+
//setupSteps.Clear();
//var steps = new ObservableCollection<StepUI>();
//int num = seq.GetNumSteps(StepGroups.StepGroup_Setup);
@@ -231,10 +249,39 @@
}
ui.Children = LoadSteps(sunSequence, group);
}
+ else
+ {
+ string seqName = po.GetValString("SeqName", 0);
+ if (!Path.IsPathRooted(sfPath))
+ {
+ sfPath = Path.Combine(Path.GetDirectoryName(CurrentFilePath), sfPath);
+ }
+ SequenceFile diffSequence = null;
+ try
+ {
+ if (cacheFiles.ContainsKey(sfPath))
+ {
+ diffSequence = cacheFiles[sfPath];
+ }
+ else if (File.Exists(sfPath))
+ {
+ diffSequence = engine.GetSequenceFileEx(sfPath);
+ cacheFiles[sfPath] = diffSequence;
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Warn("Read Diff SubSequence Failed.", ex);
+ }
+ if (diffSequence != null)
+ {
+ Sequence sunSequence = diffSequence.GetSequenceByName(seqName);
+ ui.Children = LoadSteps(sunSequence, group);
+ }
+ }
}
else
{
- ui.CustomIndex = ++indexCache;
}
if (CurrentSeqUI != null)
{
@@ -309,6 +356,10 @@
{
sequenceFile?.Save(CurrentFilePath);
CurrentSeqUI.IsChanged = false;
+ foreach (var key in cacheFiles.Keys)
+ {
+ cacheFiles[key]?.Save(key);
+ }
ToastHelper.Success(LangUtil.Get("App.SaveSuccess"));
}
catch (Exception ex)
@@ -332,6 +383,10 @@
{
sequenceFile.Save(sfd.FileName);
CurrentFilePath = sfd.FileName;
+ foreach (var key in cacheFiles.Keys)
+ {
+ cacheFiles[key]?.Save(key);
+ }
ToastHelper.Success(LangUtil.Get("App.SaveSuccess"));
CurrentSeqUI.IsChanged = false;
}
@@ -369,9 +424,14 @@
if (engine != null && sequenceFile != null)
{
engine.ReleaseSequenceFileEx(sequenceFile);
+ foreach (var file in cacheFiles.Values)
+ {
+ engine.ReleaseSequenceFileEx(file);
+ }
sequenceFile = null;
}
+ cacheFiles.Clear();
setupSteps.Clear();
mainSteps.Clear();
cleanupSteps.Clear();
@@ -552,7 +612,38 @@
{
indexCache = 0;
sequenceCache.Clear();
- AllSteps = LoadSteps(CurrentSeqUI.sequence);
+ foreach (var file in cacheFiles.Values)
+ {
+ try
+ {
+ engine.ReleaseSequenceFileEx(file);
+ Marshal.ReleaseComObject(file);
+ }
+ catch (Exception ex)
+ {
+ log.Error("RefreshData Release Last CacheFile Failed.", ex);
+ }
+ }
+ var converter = control.Resources["treeNumber"] as RowNumberConverter;
+ converter.Reset();
+ var temp = LoadSteps(CurrentSeqUI.sequence);
+ SetIndex(temp);
+ AllSteps = temp;
+ }
+
+ void SetIndex(IEnumerable<StepUI> datas)
+ {
+ foreach (var data in datas)
+ {
+ if (indexType.Contains(data.Type))
+ {
+ data.CustomIndex = ++indexCache;
+ }
+ if (data.Children != null && data.Children.Count > 0)
+ {
+ SetIndex(data.Children);
+ }
+ }
}
partial void OnAllStepsChanged(ObservableCollection<StepUI> data)
--
Gitblit v1.9.1