解决设备不存在时的卡顿问题

This commit is contained in:
zqm
2026-01-06 09:56:59 +08:00
parent 9ee598cc49
commit 87dee33c76
2 changed files with 41 additions and 37 deletions

View File

@@ -83,6 +83,10 @@ namespace JoyD.Windows.CS.Toprie
// 是否暂停检测 // 是否暂停检测
private bool _isPaused = false; private bool _isPaused = false;
/// <summary>
/// 首次ping通设备并更新信息
/// </summary>
private volatile bool _isFirst = true;
// 项目路径,用于数据文件的存取 // 项目路径,用于数据文件的存取
private string _projectPath = ""; private string _projectPath = "";
@@ -560,11 +564,30 @@ namespace JoyD.Windows.CS.Toprie
{ {
try try
{ {
StartCamera(); // 启动设备Ping
StartDevicePing();
// 延迟启动相机,避免界面卡顿
ThreadPool.QueueUserWorkItem(delegate
{
while(!IsDevicePingable)
Thread.Sleep(3000); // 延迟3秒后启动
_isFirst = false;
this.Invoke(new Action(() =>
{
try
{
StartCamera();
}
catch (Exception ex)
{
ShowError($"自动启动相机失败: {ex.Message}");
}
}));
});
} }
catch (Exception ex) catch (Exception ex)
{ {
ShowError($"自动启动相机失败: {ex.Message}"); ShowError($"启动相机失败: {ex.Message}");
} }
} }
} }
@@ -694,8 +717,6 @@ namespace JoyD.Windows.CS.Toprie
/// </summary> /// </summary>
public void StartCamera() public void StartCamera()
{ {
// 启动设备Ping
StartDevicePing();
if (DesignMode) return; if (DesignMode) return;
try try
{ {
@@ -949,7 +970,6 @@ namespace JoyD.Windows.CS.Toprie
} }
catch (ObjectDisposedException) catch (ObjectDisposedException)
{ {
Console.WriteLine("控件已释放跳过UI更新");
} }
return; return;
} }
@@ -963,7 +983,7 @@ namespace JoyD.Windows.CS.Toprie
// 调用温度显示更新方法 // 调用温度显示更新方法
// 在就绪条件下,调用更新实时信息 // 在就绪条件下,调用更新实时信息
bool isReady = !_isPaused && IsDevicePingable && _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Connected; bool isReady = _deviceManager != null && (_isFirst || (!_isPaused && IsDevicePingable && _deviceManager.ConnectionStatus == ConnectionStatus.Connected));
if (isReady) if (isReady)
{ {
UpdateRealTimeInfoOnUI(); UpdateRealTimeInfoOnUI();
@@ -979,11 +999,9 @@ namespace JoyD.Windows.CS.Toprie
// 检查图像缓冲区是否有效 // 检查图像缓冲区是否有效
if (_imageBuffer == null) if (_imageBuffer == null)
{ {
Console.WriteLine("图像缓冲区未初始化,尝试重新初始化");
InitializeImageBuffer(); InitializeImageBuffer();
if (_imageBuffer == null) if (_imageBuffer == null)
{ {
Console.WriteLine("重新初始化图像缓冲区失败");
return; return;
} }
} }
@@ -991,12 +1009,17 @@ namespace JoyD.Windows.CS.Toprie
// 保存旧图像引用,以便在设置新图像后释放 // 保存旧图像引用,以便在设置新图像后释放
oldImage = imageBox.Image; oldImage = imageBox.Image;
// 获取当前的LastImage引用 if (!_isFirst)
lock (_lastImageLock)
{ {
if (_lastImage != null) // 获取当前的LastImage引用
lock (_lastImageLock)
{ {
lastImage = (Image)_lastImage.Clone(); if (_lastImage == null)
{
return;
}
// 直接使用_lastImage引用避免创建不必要的副本
lastImage = _lastImage;
} }
} }
@@ -1005,7 +1028,8 @@ namespace JoyD.Windows.CS.Toprie
{ {
if (_infoImage != null) if (_infoImage != null)
{ {
infoImage = (Image)_infoImage.Clone(); // 直接使用_infoImage引用避免创建不必要的副本
infoImage = _infoImage;
} }
} }
@@ -1090,7 +1114,6 @@ namespace JoyD.Windows.CS.Toprie
{ {
// 特别处理"参数无效"异常 // 特别处理"参数无效"异常
Console.WriteLine($"图像参数无效异常: {ex.Message}"); Console.WriteLine($"图像参数无效异常: {ex.Message}");
// 尝试设置旧图像回来,不需要再次检查控件状态(已在方法开始处检查) // 尝试设置旧图像回来,不需要再次检查控件状态(已在方法开始处检查)
if (oldImage != null) if (oldImage != null)
{ {
@@ -1146,25 +1169,15 @@ namespace JoyD.Windows.CS.Toprie
return; return;
} }
Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 接收连接状态变更事件: {e.Status}");
// 捕获所有可能的异常,确保事件处理器不会崩溃 // 捕获所有可能的异常,确保事件处理器不会崩溃
try try
{ {
// 首先检查控件状态 // 首先检查控件状态
if (this.IsDisposed || this.Disposing) if (this.IsDisposed || this.Disposing)
{ {
Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 控件已释放或正在释放跳过UI更新");
return; return;
} }
// 检查事件参数中的状态信息
string statusMessage = $"连接状态变更为: {e.Status}";
if (!string.IsNullOrEmpty(e.DeviceInfo))
{
statusMessage += $" (设备信息: {e.DeviceInfo})";
}
// 线程安全处理 - 确保在UI线程上更新 // 线程安全处理 - 确保在UI线程上更新
if (this.InvokeRequired) if (this.InvokeRequired)
{ {
@@ -1178,10 +1191,6 @@ namespace JoyD.Windows.CS.Toprie
{ {
HandleConnectionStatusChanged(args); HandleConnectionStatusChanged(args);
} }
else
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 异步调用期间控件已释放,跳过处理");
}
}), e); }), e);
} }
catch (ObjectDisposedException ode) catch (ObjectDisposedException ode)
@@ -1220,7 +1229,7 @@ namespace JoyD.Windows.CS.Toprie
// 确保在UI线程上更新UI // 确保在UI线程上更新UI
if (this.InvokeRequired) if (this.InvokeRequired)
{ {
this.Invoke(new Action<ConnectionStatusChangedEventArgs>(HandleConnectionStatusChanged), e); this.BeginInvoke(new Action<ConnectionStatusChangedEventArgs>(HandleConnectionStatusChanged), e);
return; return;
} }
@@ -1230,14 +1239,9 @@ namespace JoyD.Windows.CS.Toprie
// 检查_deviceManager是否为空 // 检查_deviceManager是否为空
if (_deviceManager == null) if (_deviceManager == null)
{ {
Console.WriteLine("设备管理器未初始化");
WriteLog("设备管理器未初始化");
return; return;
} }
// 记录连接状态变化
WriteLog($"连接状态变化: {e.Status} {(!string.IsNullOrEmpty(e.DeviceInfo) ? "- " + e.DeviceInfo : "")}");
switch (e.Status) switch (e.Status)
{ {
case ConnectionStatus.Connected: case ConnectionStatus.Connected:
@@ -1869,7 +1873,7 @@ namespace JoyD.Windows.CS.Toprie
// 在线程安全的方式下更新状态 // 在线程安全的方式下更新状态
if (this.InvokeRequired) if (this.InvokeRequired)
{ {
this.Invoke(new Action<bool>(UpdatePingState), pingResult); this.BeginInvoke(new Action<bool>(UpdatePingState), pingResult);
} }
else else
{ {

View File

@@ -32,7 +32,7 @@ using System.Runtime.InteropServices;
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示: //通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.3")] [assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.0.0.7")] [assembly: AssemblyFileVersion("1.0.1.0")]
// NuGet包相关信息已在项目文件中配置 // NuGet包相关信息已在项目文件中配置