diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index 96fd2e5..3c87bae 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -312,7 +312,6 @@ namespace JoyD.Windows.CS.Toprie DeviceManager.IsDesignMode = DesignMode; Console.WriteLine($"相机控件设计模式状态已更新: {DesignMode}"); } - /// /// 更新InfoImage显示 - 按照用户要求的详细步骤: /// 1. 以透明色清空Info @@ -397,6 +396,7 @@ namespace JoyD.Windows.CS.Toprie new RectangleF(0, BUFFER_HEIGHT / 3, BUFFER_WIDTH, BUFFER_HEIGHT / 3), format); } + Console.WriteLine($"当前状态:{text}"); } } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index fae3d5b..a0318b2 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -367,9 +367,9 @@ namespace JoyD.Windows.CS.Toprie private Thread _temperatureProcessingThread; // 温度数据处理线程 private volatile bool _shouldStopProcessing = false; // 控制处理线程停止的标志 // 设备连接状态 - private ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected; + private volatile ConnectionStatus _connectionStatus = ConnectionStatus.Disconnected; // 是否已初始化 - private bool _isInitialized = false; + private volatile bool _isInitialized = false; // 是否已释放 private readonly bool _isDisposed = false; // 图像模式 @@ -2728,34 +2728,9 @@ namespace JoyD.Windows.CS.Toprie if (!_isDisposed && _connectionStatus == ConnectionStatus.Connected) { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检测到连接已断开: _connectionStatus={_connectionStatus}, isStillConnected={isStillConnected}, _isInitialized={_isInitialized}"); - // 断开连接时重置初始化状态和SDK实例 + // 断开连接时,只重置初始化状态,不立即释放SDK实例 + // 保留SDK实例可以避免下次连接时重新创建的开销 _isInitialized = false; - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 重置初始化状态为false"); - - // 安全释放SDK实例 - A8SDK oldSdk = _a8Sdk; - _a8Sdk = null; - - // 在锁外释放资源 - if (oldSdk != null) - { - ThreadPool.QueueUserWorkItem((obj) => - { - try - { - // 注意:A8SDK类没有Dispose方法,这里只记录日志 - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - SDK实例引用已处理"); - } - catch (Exception disposeEx) - { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] SDK资源释放异常: {disposeEx.Message}"); - } - }); - } - else - { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - SDK实例已为空,无需释放"); - } UpdateConnectionStatus(ConnectionStatus.Disconnected, "连接已断开:设备离线"); @@ -2798,22 +2773,17 @@ namespace JoyD.Windows.CS.Toprie // 注意:此方法被CheckConnectionWrapper调用,已经在线程安全的上下文中 // 不需要额外加锁,但需要确保SDK实例的访问是线程安全的 - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 开始检查连接有效性"); try { - // 记录当前状态信息 - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前状态: _currentDeviceId={_currentDeviceId}, _deviceIp={_deviceIp}, _a8Sdk={(null == _a8Sdk ? "null" : "存在")}"); - // 重要修改:先检查设备ID有效性,避免后续无效检查 + // 重要修改:设备ID无效不再直接返回false,继续执行心跳检测 if (_currentDeviceId == -1) { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效,返回false"); - return false; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效,继续执行心跳检测"); } // 优化1: 优先尝试ping设备IP地址,这是物理连接断开的最直接检测 bool pingResult = PingDevice(_deviceIp); - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - ping检测结果: {pingResult}"); if (!pingResult) { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 设备IP {_deviceIp} 不可达,物理连接可能已断开,返回false"); @@ -2822,7 +2792,6 @@ namespace JoyD.Windows.CS.Toprie // 优化2: 系统网络接口检测作为辅助检查,不再作为首要条件 bool networkAvailable = IsNetworkAvailable(); - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 网络可用性检测结果: {networkAvailable}"); if (!networkAvailable) { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 警告: 系统网络连接不可用,但ping检测通过"); @@ -2838,7 +2807,6 @@ namespace JoyD.Windows.CS.Toprie // 先创建新实例,再原子赋值,避免中间状态 A8SDK newSdk = new A8SDK(_deviceIp); _a8Sdk = newSdk; - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK实例已创建"); } // 增强心跳检测重试机制,提高连接稳定性 @@ -2849,18 +2817,15 @@ namespace JoyD.Windows.CS.Toprie { try { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测...(尝试 {retry + 1}/{maxHeartbeatRetries + 1})"); heartbeatResult = _a8Sdk.Heartbeat(); // 严格检查返回值,确保连接有效 if (heartbeatResult == 1) // V8.Heartbeat()方法返回1表示成功 { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测成功"); break; } else if (retry < maxHeartbeatRetries) { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测失败,返回代码: {heartbeatResult},等待500ms后重试..."); Thread.Sleep(500); // 增加重试间隔到500ms } else @@ -2878,6 +2843,7 @@ namespace JoyD.Windows.CS.Toprie if (heartbeatResult == 1) { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接成功"); + return true; // 重新连接成功,返回true } else { @@ -2885,14 +2851,13 @@ namespace JoyD.Windows.CS.Toprie } } } - catch (Exception ex) + catch + { + if (retry < maxHeartbeatRetries) { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 心跳检测异常: {ex.Message}"); - if (retry < maxHeartbeatRetries) - { - Thread.Sleep(500); // 增加重试间隔到500ms - } + Thread.Sleep(500); // 增加重试间隔到500ms } + } } if (heartbeatResult != 1)