Using Queues to Improve Message Display

pull/5636/head
2dust 3 months ago
parent b02ad6cdab
commit 6879c75bc8

@ -66,14 +66,12 @@
<TextBlock <TextBlock
Margin="8,0" Margin="8,0"
VerticalAlignment="Center" VerticalAlignment="Center"
IsVisible="False"
Text="{x:Static resx:ResUI.TbAutoScrollToEnd}" /> Text="{x:Static resx:ResUI.TbAutoScrollToEnd}" />
<ToggleSwitch <ToggleSwitch
x:Name="togScrollToEnd" x:Name="togScrollToEnd"
Margin="8,0" Margin="8,0"
HorizontalAlignment="Left" HorizontalAlignment="Left"
IsChecked="True" IsChecked="True" />
IsVisible="False" />
</WrapPanel> </WrapPanel>
<TextBox <TextBox
Name="txtMsg" Name="txtMsg"

@ -11,10 +11,11 @@ namespace v2rayN.Desktop.Views
public partial class MsgView : UserControl public partial class MsgView : UserControl
{ {
private static Config? _config; private static Config? _config;
private ConcurrentQueue<string> _queueMsg = new();
private int _numMaxMsg = 500;
private string lastMsgFilter = string.Empty; private string lastMsgFilter = string.Empty;
private bool lastMsgFilterNotAvailable; private bool lastMsgFilterNotAvailable;
private ConcurrentBag<string> _lstMsg = [];
public MsgView() public MsgView()
{ {
@ -74,30 +75,30 @@ namespace v2rayN.Desktop.Views
if (togScrollToEnd.IsChecked ?? true) if (togScrollToEnd.IsChecked ?? true)
{ {
txtMsg.CaretIndex = int.MaxValue;
} }
} }
private void ShowMsg(string msg) private void ShowMsg(string msg)
{ {
if (_lstMsg.Count > 999) if (_queueMsg.Count > _numMaxMsg)
{ {
ClearMsg(); for (int k = 0; k < _queueMsg.Count - _numMaxMsg; k++)
{
_queueMsg.TryDequeue(out _);
} }
}
_queueMsg.Enqueue(msg);
if (!msg.EndsWith(Environment.NewLine)) if (!msg.EndsWith(Environment.NewLine))
{ {
_lstMsg.Add(Environment.NewLine); _queueMsg.Enqueue(Environment.NewLine);
} }
_lstMsg.Add(msg); txtMsg.Text = string.Join("", _queueMsg.ToArray());
// if (!msg.EndsWith(Environment.NewLine))
// {
// _lstMsg.Add(Environment.NewLine);
// }
this.txtMsg.Text = string.Join("", _lstMsg);
} }
public void ClearMsg() public void ClearMsg()
{ {
_lstMsg.Clear(); _queueMsg.Clear();
txtMsg.Clear(); txtMsg.Clear();
} }

@ -1,4 +1,5 @@
using ReactiveUI; using ReactiveUI;
using System.Collections.Concurrent;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Windows.Threading; using System.Windows.Threading;
@ -8,6 +9,8 @@ namespace v2rayN.Views
public partial class MsgView public partial class MsgView
{ {
private static Config? _config; private static Config? _config;
private ConcurrentQueue<string> _queueMsg = new();
private int _numMaxMsg = 500;
private string lastMsgFilter = string.Empty; private string lastMsgFilter = string.Empty;
private bool lastMsgFilterNotAvailable; private bool lastMsgFilterNotAvailable;
@ -80,19 +83,24 @@ namespace v2rayN.Views
private void ShowMsg(string msg) private void ShowMsg(string msg)
{ {
if (txtMsg.LineCount > 999) if (_queueMsg.Count > _numMaxMsg)
{ {
ClearMsg(); for (int k = 0; k < _queueMsg.Count - _numMaxMsg; k++)
{
_queueMsg.TryDequeue(out _);
}
} }
this.txtMsg.AppendText(msg); _queueMsg.Enqueue(msg);
if (!msg.EndsWith(Environment.NewLine)) if (!msg.EndsWith(Environment.NewLine))
{ {
this.txtMsg.AppendText(Environment.NewLine); _queueMsg.Enqueue(Environment.NewLine);
} }
txtMsg.Text = string.Join("", _queueMsg.ToArray());
} }
public void ClearMsg() public void ClearMsg()
{ {
_queueMsg.Clear();
txtMsg.Clear(); txtMsg.Clear();
} }

Loading…
Cancel
Save