Skip to content

Commit b5e05bc

Browse files
committed
fix: 一些报错与卡死问题
1 parent 841cc03 commit b5e05bc

File tree

4 files changed

+62
-39
lines changed

4 files changed

+62
-39
lines changed

llcomNext/LLCOM/Models/TerminalObject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ public List<List<TerminalBlock>> GetShowLines()
334334
{
335335
//加几个空格,直到光标位置
336336
if(allLength < PositionX)
337-
tempLine.Add(new TerminalBlock(new string(' ', allLength - PositionX)));
337+
tempLine.Add(new TerminalBlock(new string(' ', PositionX - allLength)));
338338
tempLine.Add(new TerminalBlock(new string(' ', 1),-1,-1));
339339
}
340340
else

llcomNext/LLCOM/ViewModels/DataViews/TerminalViewModel.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ private async Task Test()
3737
var testChars = "测试Test".ToCharArray();
3838
for(int i=0; i<1000; i++)
3939
{
40-
TerminalObject.ChangeStyle(random.Next(30,38),random.Next(30,38));
41-
TerminalObject.ChangePosition(random.Next(0,TerminalObject.WindowWidth), random.Next(0,TerminalObject.WindowHeight));
42-
TerminalObject.AddText([testChars[random.Next(0, testChars.Length)]]);
43-
TerminalChangedEvent?.Invoke(this, TerminalObject.GetShowLines());
40+
lock (TerminalObject)
41+
{
42+
TerminalObject.ChangeStyle(random.Next(30,38),random.Next(30,38));
43+
TerminalObject.ChangePosition(random.Next(0,TerminalObject.WindowWidth), random.Next(0,TerminalObject.WindowHeight));
44+
TerminalObject.AddText([testChars[random.Next(0, testChars.Length)]]);
45+
TerminalChangedEvent?.Invoke(this, TerminalObject.GetShowLines());
46+
}
4447
await Task.Delay(1);
4548
}
4649
}
@@ -51,13 +54,23 @@ private async Task Test()
5154
//窗口大小变化
5255
public void ChangeWindowSize((int, int) size)
5356
{
54-
TerminalObject.ChangeWindowSize(size.Item1, size.Item2);
57+
lock(TerminalObject)
58+
TerminalObject.ChangeWindowSize(size.Item1, size.Item2);
5559
}
5660

5761
//滚轮事件
58-
public double MoveUp(int delta) => TerminalObject.CurrentLineMoveUp(delta);
62+
public double MoveUp(int delta)
63+
{
64+
lock(TerminalObject)
65+
return TerminalObject.CurrentLineMoveUp(delta);
66+
}
67+
5968
//滚动条变化
60-
public void ScrollBarChanged(double value) => TerminalObject.ScrollBarChanged(value);
69+
public void ScrollBarChanged(double value)
70+
{
71+
lock(TerminalObject)
72+
TerminalObject.ScrollBarChanged(value);
73+
}
6174
//接管更新事件
6275
public EventHandler<List<List<TerminalBlock>>>? TerminalChangedEvent;
6376
}

llcomNext/LLCOM/Views/DataViews/TerminalView.axaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,15 @@
4646
FontSize="{Binding TerminalFontSize, Source={x:Static services:Utils.Setting}}"
4747
SelectionBrush="{Binding TerminalTheme.SelectionBackground, Source={x:Static services:Utils.Setting}}"
4848
SelectionForegroundBrush="{Binding TerminalTheme.Background, Source={x:Static services:Utils.Setting}}" />
49+
<Panel
50+
Width="{Binding #MainScrollBar.Width}"
51+
HorizontalAlignment="Right"
52+
Background="{DynamicResource SemiColorBackground2}" />
4953
<ScrollBar
5054
Name="MainScrollBar"
5155
HorizontalAlignment="Right"
5256
AllowAutoHide="False"
57+
Background="{DynamicResource SemiColorBackground2}"
5358
Scroll="MainScrollBar_OnScroll"
5459
Visibility="Visible"
5560
Value="100" />

llcomNext/LLCOM/Views/DataViews/TerminalView.axaml.cs

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Text;
5+
using System.Threading;
56
using Avalonia;
67
using Avalonia.Controls;
78
using Avalonia.Controls.Documents;
@@ -20,9 +21,9 @@ namespace LLCOM.Views;
2021

2122
public partial class TerminalView : UserControl
2223
{
23-
private DispatcherTimer _updateTimer;
24-
private bool _dataChanged = false;
25-
readonly List<List<TerminalBlock>> _terminalBlocks = [];
24+
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
25+
private readonly EventWaitHandle _dataChangeWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
26+
private readonly List<List<TerminalBlock>> _terminalBlocks = [];
2627

2728
public TerminalView()
2829
{
@@ -38,22 +39,23 @@ protected override void OnUnloaded(RoutedEventArgs e)
3839
MainArea.PropertyChanged -= MainArea_PropertyChanged;
3940
Utils.Setting.TerminalChangedEvent -= TerminalChangedEvent;
4041
((TerminalViewModel)DataContext!).TerminalChangedEvent -= TerminalChangedEvent;
41-
_updateTimer.Stop();
42+
_cts.Cancel();
43+
_dataChangeWaitHandle.Set();
4244
Debug.WriteLine("TerminalView unloaded.");
4345
}
4446

4547
private void Control_OnLoaded(object? sender, RoutedEventArgs e)
4648
{
47-
//搞个定时器来更新UI,防止阻塞
48-
_updateTimer = new DispatcherTimer
49+
//搞个单独线程来更新UI,防止阻塞
50+
new Thread(() =>
4951
{
50-
Interval = TimeSpan.FromMilliseconds(100)
51-
};
52-
_updateTimer.Tick += (s, e) =>
53-
{
54-
if (_dataChanged)
52+
while (_cts.Token.IsCancellationRequested == false)
5553
{
56-
_dataChanged = false; // 重置标记
54+
_dataChangeWaitHandle.WaitOne();
55+
_dataChangeWaitHandle.Reset();
56+
if(_cts.Token.IsCancellationRequested)
57+
break;
58+
5759
var tempLines = new List<List<TerminalBlock>>();
5860
lock (_terminalBlocks)
5961
{
@@ -62,28 +64,31 @@ private void Control_OnLoaded(object? sender, RoutedEventArgs e)
6264
}
6365

6466
// 执行更新逻辑
65-
//清空文本
66-
MainTextBlock.Inlines!.Clear();
67-
foreach (var line in tempLines)
68-
{
69-
foreach (var block in line)
67+
Dispatcher.UIThread.Post(() =>
68+
{
69+
//清空文本
70+
MainTextBlock.Inlines!.Clear();
71+
foreach (var line in tempLines)
7072
{
71-
//添加块
72-
var run = new Run(block.Text)
73+
foreach (var block in line)
7374
{
74-
[!Span.ForegroundProperty] = new Binding(block.ForegroundBindingName) { Source = Utils.Setting },
75-
[!Span.BackgroundProperty] = new Binding(block.BackgroundBindingName) { Source = Utils.Setting },
76-
FontWeight = block.IsBold ? FontWeight.Bold : FontWeight.Normal,
77-
FontStyle = block.IsItalic ? FontStyle.Italic : FontStyle.Normal,
78-
TextDecorations = block.IsUnderLine ? TextDecorations.Underline : null,
79-
};
80-
MainTextBlock.Inlines.Add(run);
75+
//添加块
76+
var run = new Run(block.Text)
77+
{
78+
[!Span.ForegroundProperty] = new Binding(block.ForegroundBindingName) { Source = Utils.Setting },
79+
[!Span.BackgroundProperty] = new Binding(block.BackgroundBindingName) { Source = Utils.Setting },
80+
FontWeight = block.IsBold ? FontWeight.Bold : FontWeight.Normal,
81+
FontStyle = block.IsItalic ? FontStyle.Italic : FontStyle.Normal,
82+
TextDecorations = block.IsUnderLine ? TextDecorations.Underline : null,
83+
};
84+
MainTextBlock.Inlines.Add(run);
85+
}
86+
MainTextBlock.Inlines.Add(new LineBreak());
8187
}
82-
MainTextBlock.Inlines.Add(new LineBreak());
83-
}
88+
});
89+
Thread.Sleep(150);
8490
}
85-
};
86-
_updateTimer.Start();
91+
}).Start();
8792

8893
Utils.Setting.TerminalChangedEvent += TerminalChangedEvent;
8994
((TerminalViewModel)DataContext!).TerminalChangedEvent += TerminalChangedEvent;
@@ -132,7 +137,7 @@ private void TerminalChangedEvent(object? sender, List<List<TerminalBlock>> e)
132137
//克隆数据
133138
_terminalBlocks.AddRange(CloneAllLines(e));
134139
}
135-
_dataChanged = true;
140+
_dataChangeWaitHandle.Set();
136141
}
137142

138143
private List<List<TerminalBlock>> CloneAllLines(List<List<TerminalBlock>> lines)

0 commit comments

Comments
 (0)