diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index f62bea4..88dcce1 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -83,6 +83,10 @@ namespace JoyD.Windows.CS.Toprie // 是否暂停检测 private bool _isPaused = false; + /// + /// 首次ping通设备并更新信息 + /// + private volatile bool _isFirst = true; // 项目路径,用于数据文件的存取 private string _projectPath = ""; @@ -560,11 +564,30 @@ namespace JoyD.Windows.CS.Toprie { 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) { - ShowError($"自动启动相机失败: {ex.Message}"); + ShowError($"启动相机失败: {ex.Message}"); } } } @@ -694,8 +717,6 @@ namespace JoyD.Windows.CS.Toprie /// public void StartCamera() { - // 启动设备Ping - StartDevicePing(); if (DesignMode) return; try { @@ -949,7 +970,6 @@ namespace JoyD.Windows.CS.Toprie } catch (ObjectDisposedException) { - Console.WriteLine("控件已释放,跳过UI更新"); } 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) { UpdateRealTimeInfoOnUI(); @@ -979,11 +999,9 @@ namespace JoyD.Windows.CS.Toprie // 检查图像缓冲区是否有效 if (_imageBuffer == null) { - Console.WriteLine("图像缓冲区未初始化,尝试重新初始化"); InitializeImageBuffer(); if (_imageBuffer == null) { - Console.WriteLine("重新初始化图像缓冲区失败"); return; } } @@ -991,12 +1009,17 @@ namespace JoyD.Windows.CS.Toprie // 保存旧图像引用,以便在设置新图像后释放 oldImage = imageBox.Image; - // 获取当前的LastImage引用 - lock (_lastImageLock) + if (!_isFirst) { - 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) { - infoImage = (Image)_infoImage.Clone(); + // 直接使用_infoImage引用,避免创建不必要的副本 + infoImage = _infoImage; } } @@ -1090,7 +1114,6 @@ namespace JoyD.Windows.CS.Toprie { // 特别处理"参数无效"异常 Console.WriteLine($"图像参数无效异常: {ex.Message}"); - // 尝试设置旧图像回来,不需要再次检查控件状态(已在方法开始处检查) if (oldImage != null) { @@ -1146,25 +1169,15 @@ namespace JoyD.Windows.CS.Toprie return; } - Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 接收连接状态变更事件: {e.Status}"); - // 捕获所有可能的异常,确保事件处理器不会崩溃 try { // 首先检查控件状态 if (this.IsDisposed || this.Disposing) { - Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 控件已释放或正在释放,跳过UI更新"); return; } - // 检查事件参数中的状态信息 - string statusMessage = $"连接状态变更为: {e.Status}"; - if (!string.IsNullOrEmpty(e.DeviceInfo)) - { - statusMessage += $" (设备信息: {e.DeviceInfo})"; - } - // 线程安全处理 - 确保在UI线程上更新 if (this.InvokeRequired) { @@ -1178,10 +1191,6 @@ namespace JoyD.Windows.CS.Toprie { HandleConnectionStatusChanged(args); } - else - { - Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 异步调用期间控件已释放,跳过处理"); - } }), e); } catch (ObjectDisposedException ode) @@ -1220,7 +1229,7 @@ namespace JoyD.Windows.CS.Toprie // 确保在UI线程上更新UI if (this.InvokeRequired) { - this.Invoke(new Action(HandleConnectionStatusChanged), e); + this.BeginInvoke(new Action(HandleConnectionStatusChanged), e); return; } @@ -1230,14 +1239,9 @@ namespace JoyD.Windows.CS.Toprie // 检查_deviceManager是否为空 if (_deviceManager == null) { - Console.WriteLine("设备管理器未初始化"); - WriteLog("设备管理器未初始化"); return; } - // 记录连接状态变化 - WriteLog($"连接状态变化: {e.Status} {(!string.IsNullOrEmpty(e.DeviceInfo) ? "- " + e.DeviceInfo : "")}"); - switch (e.Status) { case ConnectionStatus.Connected: @@ -1869,7 +1873,7 @@ namespace JoyD.Windows.CS.Toprie // 在线程安全的方式下更新状态 if (this.InvokeRequired) { - this.Invoke(new Action(UpdatePingState), pingResult); + this.BeginInvoke(new Action(UpdatePingState), pingResult); } else { diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Properties/AssemblyInfo.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Properties/AssemblyInfo.cs index e2074b7..853ae9e 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Properties/AssemblyInfo.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Properties/AssemblyInfo.cs @@ -32,7 +32,7 @@ using System.Runtime.InteropServices; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.3")] -[assembly: AssemblyFileVersion("1.0.0.7")] +[assembly: AssemblyVersion("1.0.1.0")] +[assembly: AssemblyFileVersion("1.0.1.0")] // NuGet包相关信息已在项目文件中配置