diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs index 225b6ee..a27acbe 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.Designer.cs @@ -24,7 +24,7 @@ this.imageBox.Dock = System.Windows.Forms.DockStyle.Fill; this.imageBox.Location = new System.Drawing.Point(0, 0); this.imageBox.Name = "imageBox"; - this.imageBox.Size = new System.Drawing.Size(150, 150); + this.imageBox.Size = new System.Drawing.Size(512, 384); this.imageBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.imageBox.TabIndex = 0; this.imageBox.TabStop = false; @@ -35,6 +35,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.imageBox); this.Name = "Camera"; + this.Size = new System.Drawing.Size(512, 384); this.Load += new System.EventHandler(this.Camera_Load); ((System.ComponentModel.ISupportInitialize)(this.imageBox)).EndInit(); this.ResumeLayout(false); diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index b2df931..b052b60 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -23,12 +23,26 @@ namespace JoyD.Windows.CS.Toprie private System.Windows.Forms.Timer _errorDisplayTimer; public Camera() - { + { InitializeComponent(); + // 将设计模式状态传递给DeviceManager + DeviceManager.IsDesignMode = DesignMode; + // 只有在非设计模式下才初始化设备管理器和错误定时器 if (!DesignMode) { + // 清空现有日志 + try + { + string logFile = Path.Combine(Application.StartupPath, "camera.log"); + if (File.Exists(logFile)) + { + File.WriteAllText(logFile, string.Empty); + } + } + catch { } + InitializeDeviceManager(); InitializeErrorTimer(); } @@ -60,13 +74,16 @@ namespace JoyD.Windows.CS.Toprie /// 初始化设备管理器 /// private void InitializeDeviceManager() - { + { _deviceManager = new DeviceManager - { + { AutoReconnectEnabled = true, ReconnectInterval = 2000 // 2秒 }; + // 确保DeviceManager的设计模式状态与控件一致 + DeviceManager.IsDesignMode = DesignMode; + // 设置静态属性 DeviceManager.MaxReconnectAttempts = 5; diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index c2c8f2f..58d3fab 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -118,6 +118,9 @@ namespace JoyD.Windows.CS.Toprie public class DeviceManager : IDisposable { + // 设计模式标志,用于在设计模式下跳过实际的设备连接和初始化 + public static bool IsDesignMode { get; set; } = false; + // A8SDK实例 private A8SDK _a8Sdk; // 设备ID列表 @@ -209,20 +212,48 @@ namespace JoyD.Windows.CS.Toprie try { bool isAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); - Console.WriteLine($"网络可用性检查: {(isAvailable ? "可用" : "不可用")}"); + Log($"网络可用性检查: {(isAvailable ? "可用" : "不可用")}"); return isAvailable; } catch (Exception ex) { - Console.WriteLine($"网络检查异常: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 捕获异常: {ex.Message}"); return false; } } private TcpClient _imageTcpClient; private bool _isInfraredMode = true; + private static readonly object _logLock = new object(); #region 私有方法 + /// + /// 记录日志到控制台和文件 + /// + private void Log(string message) + { + // 输出到控制台 + Console.WriteLine(message); + + // 输出到日志文件 + try + { + lock (_logLock) + { + string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log.txt"); + // 确保目录存在 + Directory.CreateDirectory(Path.GetDirectoryName(logPath)); + // 写入日志,包含时间戳 + File.AppendAllText(logPath, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {message}\r\n"); + } + } + catch (Exception ex) + { + // 如果写入日志文件失败,只输出到控制台 + Console.WriteLine($"日志写入失败: {ex.Message}"); + } + } + /// /// 从设备字符串中解析设备ID /// @@ -253,10 +284,11 @@ namespace JoyD.Windows.CS.Toprie /// 相关异常(如果有) private void UpdateConnectionStatus(ConnectionStatus newStatus, string message = null, Exception exception = null) { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] UpdateConnectionStatus() - 尝试更新状态: {_connectionStatus} -> {newStatus}, 消息: {message}"); // 检查对象是否已被释放 if (_isDisposed) { - Console.WriteLine("警告: 尝试在已释放对象上更新连接状态"); + Log("警告: 尝试在已释放对象上更新连接状态"); return; } @@ -264,6 +296,7 @@ namespace JoyD.Windows.CS.Toprie { ConnectionStatus oldStatus = _connectionStatus; _connectionStatus = newStatus; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] UpdateConnectionStatus() - 状态已更新: {oldStatus} -> {newStatus}"); // 触发连接状态变更事件前再次检查对象是否已被释放 if (!_isDisposed) @@ -274,18 +307,20 @@ namespace JoyD.Windows.CS.Toprie } catch (Exception ex) { - Console.WriteLine($"触发连接状态变更事件异常: {ex.Message}"); + Log($"触发连接状态变更事件异常: {ex.Message}"); } } + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 异常处理完成"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 连接检查正常完成"); - Console.WriteLine($"连接状态变更: {oldStatus} -> {newStatus}"); + Log($"连接状态变更: {oldStatus} -> {newStatus}"); if (!string.IsNullOrEmpty(message)) { - Console.WriteLine($"状态消息: {message}"); + Log($"状态消息: {message}"); } if (exception != null) { - Console.WriteLine($"异常信息: {exception.Message}"); + Log($"异常信息: {exception.Message}"); } // 如果断开连接且启用了自动重连,启动重连机制 @@ -315,13 +350,28 @@ namespace JoyD.Windows.CS.Toprie /// 是否初始化成功 private bool Initialize() { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 开始执行初始化"); + + // 在设计模式下,跳过实际初始化,直接返回成功 + if (IsDesignMode) + { + Log("设计模式下跳过实际初始化,模拟初始化成功"); + _isInitialized = true; + _connectionStatus = ConnectionStatus.Connected; + return true; + } + // 双重检查锁定模式,确保线程安全的初始化 if (_isInitialized) + { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 已经初始化,直接返回成功"); return true; + } try { // 清理旧资源(如果有) + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 清理旧资源"); CleanupResources(); // 初始化设备ID列表和相关变量 @@ -332,12 +382,12 @@ namespace JoyD.Windows.CS.Toprie _connectionStatus = ConnectionStatus.Disconnected; _currentReconnectAttempt = 0; - Console.WriteLine("开始SDK初始化..."); + Log("开始SDK初始化..."); // 首先检查网络可用性 if (!IsNetworkAvailable()) { - Console.WriteLine("网络不可用,初始化暂缓"); + Log("网络不可用,初始化暂缓"); return false; } @@ -352,7 +402,7 @@ namespace JoyD.Windows.CS.Toprie { if (retry > 0) { - Console.WriteLine($"SDK初始化重试 {retry}/{maxInitRetries}"); + Log($"SDK初始化重试 {retry}/{maxInitRetries}"); Thread.Sleep(300); // 重试前等待一小段时间 } @@ -362,36 +412,38 @@ namespace JoyD.Windows.CS.Toprie break; // 成功,跳出循环 } - Console.WriteLine($"SDK静态初始化失败,返回值: {initResult}"); + Log($"SDK静态初始化失败,返回值: {initResult}"); } catch (Exception initEx) { - Console.WriteLine($"SDK初始化异常: {initEx.Message},堆栈: {initEx.StackTrace}"); + Log($"SDK初始化异常: {initEx.Message},堆栈: {initEx.StackTrace}"); } } if (initResult != 0) { - Console.WriteLine($"SDK静态初始化失败,所有重试均未成功,返回值: {initResult}"); + Log($"SDK静态初始化失败,所有重试均未成功,返回值: {initResult}"); _isInitialized = false; return false; } - Console.WriteLine("SDK静态初始化成功"); + Log("SDK静态初始化成功"); // 设置默认配置参数 _maxReconnectAttempts = 15; // 增加最大重连次数 _isAutoReconnectEnabled = true; _isInitialized = true; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 初始化成功,_isInitialized设为true"); return true; } catch (Exception ex) { - Console.WriteLine($"SDK初始化失败: {ex.Message},堆栈: {ex.StackTrace}"); + Log($"SDK初始化失败: {ex.Message},堆栈: {ex.StackTrace}"); _isInitialized = false; - OnConnectionException(new ConnectionExceptionEventArgs(ex, "初始化设备管理器失败")); - return false; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] Initialize() - 初始化异常,_isInitialized保持false: {ex.Message}"); + OnConnectionException(new ConnectionExceptionEventArgs(ex, "初始化设备管理器失败")); + return false; } } @@ -400,6 +452,7 @@ namespace JoyD.Windows.CS.Toprie /// private void CleanupResources() { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CleanupResources() - 开始清理资源"); try { // 停止所有定时器 @@ -413,13 +466,13 @@ namespace JoyD.Windows.CS.Toprie { try { - Console.WriteLine("释放旧SDK实例..."); + Log("释放旧SDK实例..."); // 注意:如果SDK提供了destroy方法,应该在这里调用 // A8SDK.SDK_destroy(); } catch (Exception ex) { - Console.WriteLine($"释放SDK实例异常: {ex.Message}"); + Log($"释放SDK实例异常: {ex.Message}"); } } @@ -430,12 +483,13 @@ namespace JoyD.Windows.CS.Toprie // _deviceIp = string.Empty; // 注释掉这行,避免IP地址在资源清理时被清空 _currentReconnectAttempt = 0; _isInitialized = false; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CleanupResources() - _isInitialized已设为false"); - Console.WriteLine("资源清理完成"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CleanupResources() - 资源清理完成"); } catch (Exception ex) { - Console.WriteLine($"清理资源异常: {ex.Message}"); + Log($"清理资源异常: {ex.Message}"); } } @@ -620,7 +674,8 @@ namespace JoyD.Windows.CS.Toprie // 如果初始化失败但显示已连接,尝试重新初始化 if (!_isInitialized) { - Console.WriteLine("警告: 显示已连接但初始化状态为false,尝试重新初始化..."); + Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 警告: 显示已连接但初始化状态为false,尝试重新初始化..."); + Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] 当前状态: _connectionStatus={_connectionStatus}, _isInitialized={_isInitialized}, _a8Sdk={(_a8Sdk == null ? "null" : "已初始化")}, _currentDeviceId={_currentDeviceId}"); if (!Initialize()) { Console.WriteLine("重新初始化失败,确认连接已断开"); @@ -644,7 +699,7 @@ namespace JoyD.Windows.CS.Toprie } catch (Exception ex) { - Console.WriteLine($"定时器回调异常: {ex.Message}"); + Log($"定时器回调异常: {ex.Message}"); // 异常时如果是已连接状态,将其设为断开 if (_connectionStatus == ConnectionStatus.Connected) { @@ -663,13 +718,13 @@ namespace JoyD.Windows.CS.Toprie } catch (Exception ex) { - Console.WriteLine($"创建连接检查定时器失败: {ex.Message}"); + Log($"创建连接检查定时器失败: {ex.Message}"); _connectionCheckTimer = null; } } catch (Exception ex) { - Console.WriteLine($"启动连接检查异常: {ex.Message}"); + Log($"启动连接检查异常: {ex.Message}"); StopConnectionCheck(); } } @@ -677,44 +732,52 @@ namespace JoyD.Windows.CS.Toprie // 连接检查的安全包装方法 private void CheckConnectionWrapper() { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 开始连接检查"); try { // 检查连接有效性 bool isStillConnected = CheckConnectionValidity(); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - CheckConnectionValidity返回: {isStillConnected}"); // 连接状态变化时更新状态 if (!isStillConnected && _connectionStatus == ConnectionStatus.Connected) { - Console.WriteLine("检测到连接已断开"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检测到连接已断开: _connectionStatus={_connectionStatus}, isStillConnected={isStillConnected}, _isInitialized={_isInitialized}"); // 断开连接时重置初始化状态和SDK实例 _isInitialized = false; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 重置初始化状态为false"); _a8Sdk = null; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 释放SDK实例"); UpdateConnectionStatus(ConnectionStatus.Disconnected, "连接已断开:设备离线"); // 断开连接后自动启动重连 if (_autoReconnectEnabled) { - Console.WriteLine("连接断开,启动自动重连"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 连接断开,启动自动重连"); StartAutoReconnect(); } } + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 连接检查正常完成"); } catch (Exception ex) { - Console.WriteLine($"检查连接状态异常: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检查连接状态异常: {ex.Message}"); // 检查异常时,将状态设为断开 if (_connectionStatus == ConnectionStatus.Connected) { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 异常时连接状态为Connected,需要重置"); // 异常时重置初始化状态和SDK实例 _isInitialized = false; + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 异常时重置初始化状态为false"); _a8Sdk = null; UpdateConnectionStatus(ConnectionStatus.Disconnected, "连接状态检查异常", ex); // 异常时启动自动重连 if (_autoReconnectEnabled) { - Console.WriteLine("检查异常,启动自动重连"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检查异常,启动自动重连"); StartAutoReconnect(); } } + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 异常处理完成"); } } @@ -723,27 +786,42 @@ namespace JoyD.Windows.CS.Toprie /// /// 连接是否有效 private bool CheckConnectionValidity() - { + { + // 在设计模式下,跳过实际的连接有效性检查,直接返回连接有效 + if (IsDesignMode) + { + Log("设计模式下跳过实际的连接有效性检查,模拟连接有效"); + return true; + } + + 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有效性,避免后续无效检查 if (_currentDeviceId == -1) { - Console.WriteLine("当前设备ID无效"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效,返回false"); return false; } // 优化1: 优先尝试ping设备IP地址,这是物理连接断开的最直接检测 - if (!PingDevice(_deviceIp)) + bool pingResult = PingDevice(_deviceIp); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - ping检测结果: {pingResult}"); + if (!pingResult) { - Console.WriteLine($"设备IP {_deviceIp} 不可达,物理连接可能已断开"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 设备IP {_deviceIp} 不可达,物理连接可能已断开,返回false"); return false; } // 优化2: 系统网络接口检测作为辅助检查,不再作为首要条件 - if (!IsNetworkAvailable()) + bool networkAvailable = IsNetworkAvailable(); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 网络可用性检测结果: {networkAvailable}"); + if (!networkAvailable) { - Console.WriteLine("警告: 系统网络连接不可用,但ping检测通过"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 警告: 系统网络连接不可用,但ping检测通过"); } // 优化3: 加强SDK连接状态验证,参考热像仪示例的实现方式 @@ -752,8 +830,9 @@ namespace JoyD.Windows.CS.Toprie // 使用线程安全的SDK实例创建 if (_a8Sdk == null) { - Console.WriteLine("SDK实例不存在,重新初始化..."); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK实例不存在,重新初始化..."); _a8Sdk = new A8SDK(_deviceIp); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK实例已创建"); } // 增强心跳检测重试机制,提高连接稳定性 @@ -764,53 +843,55 @@ namespace JoyD.Windows.CS.Toprie { try { - Console.WriteLine($"SDK心跳检测...(尝试 {retry + 1}/{maxHeartbeatRetries + 1})"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测...(尝试 {retry + 1}/{maxHeartbeatRetries + 1})"); heartbeatResult = _a8Sdk.Heartbeat(); // 严格检查返回值,确保连接有效 if (heartbeatResult == 0) // 参考Toprie项目,假设0表示成功 { - Console.WriteLine("SDK心跳检测成功"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测成功"); break; } else if (retry < maxHeartbeatRetries) { - Console.WriteLine($"SDK心跳检测失败,返回代码: {heartbeatResult},等待500ms后重试..."); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测失败,返回代码: {heartbeatResult},等待500ms后重试..."); Thread.Sleep(500); // 增加重试间隔到500ms } else { - Console.WriteLine("SDK心跳检测多次失败,尝试重建SDK连接..."); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测多次失败,尝试重建SDK连接..."); // 安全释放旧的SDK实例 A8SDK oldSdk = Interlocked.Exchange(ref _a8Sdk, null); // 尝试重建SDK连接 Thread.Sleep(500); _a8Sdk = new A8SDK(_deviceIp); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 已重建SDK连接,进行最后一次心跳检测"); Thread.Sleep(500); heartbeatResult = _a8Sdk.Heartbeat(); if (heartbeatResult == 0) { - Console.WriteLine("SDK重新连接成功"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接成功"); } else { - Console.WriteLine($"SDK重新连接失败,返回代码: {heartbeatResult}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接失败,返回代码: {heartbeatResult}"); } } } catch (Exception ex) - { - Console.WriteLine($"心跳检测异常: {ex.Message}"); - if (retry < maxHeartbeatRetries) { - Thread.Sleep(500); // 增加重试间隔到500ms + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 心跳检测异常: {ex.Message}"); + if (retry < maxHeartbeatRetries) + { + Thread.Sleep(500); // 增加重试间隔到500ms + } } - } } if (heartbeatResult != 0) { + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 心跳检测最终失败,返回false"); // 心跳失败时,安全释放SDK实例 if (_a8Sdk != null) { @@ -822,19 +903,20 @@ namespace JoyD.Windows.CS.Toprie // 添加额外的连接验证步骤 try { - Console.WriteLine("进行额外连接验证..."); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 进行额外连接验证..."); // 再次发送心跳包确保连接稳定 int finalResult = _a8Sdk.Heartbeat(); if (finalResult != 0) { - Console.WriteLine($"最终验证失败,返回代码: {finalResult}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 最终验证失败,返回代码: {finalResult},返回false"); _a8Sdk = null; return false; } + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 最终验证成功"); } catch (Exception ex) { - Console.WriteLine($"连接验证异常: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 连接验证异常: {ex.Message},返回false"); _a8Sdk = null; return false; } @@ -851,24 +933,25 @@ namespace JoyD.Windows.CS.Toprie } catch (Exception ex) { - Console.WriteLine($"获取设备名称异常,但心跳检测成功: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 获取设备名称异常,但心跳检测成功: {ex.Message}"); // 设备名称获取失败不应导致整体连接失效 } } catch (Exception ex) { - Console.WriteLine($"SDK心跳检测失败: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测失败: {ex.Message},返回false"); // 确保异常时SDK实例被释放 _a8Sdk = null; return false; } // 所有检查通过,连接有效 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 所有检查通过,连接有效,返回true"); return true; } catch (Exception ex) { - Console.WriteLine($"连接有效性检查异常: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 连接有效性检查异常: {ex.Message},返回false"); // 确保异常时SDK实例被释放 _a8Sdk = null; return false; @@ -890,12 +973,12 @@ namespace JoyD.Windows.CS.Toprie timerToDispose.Change(Timeout.Infinite, Timeout.Infinite); // 安全释放定时器资源 timerToDispose.Dispose(); - Console.WriteLine("连接检查已停止"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] StopConnectionCheck() - 连接检查已停止"); } } catch (Exception ex) { - Console.WriteLine($"停止连接检查异常: {ex.Message}"); + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] StopConnectionCheck() - 停止连接检查异常: {ex.Message}"); // 确保即使异常,引用也被清空 _connectionCheckTimer = null; } @@ -1077,7 +1160,14 @@ namespace JoyD.Windows.CS.Toprie /// 开始接收图像数据 /// public void StartImageReceiving() - { + { + // 在设计模式下,跳过实际的图像接收 + if (IsDesignMode) + { + Log("设计模式下跳过实际的图像接收"); + return; + } + Console.WriteLine("开始使用HTTP方式接收图像数据"); try { @@ -1981,7 +2071,18 @@ namespace JoyD.Windows.CS.Toprie public void ConnectDevice(int deviceId) { try - { + { + // 在设计模式下,跳过实际连接,直接模拟连接成功 + if (IsDesignMode) + { + Log("设计模式下跳过实际设备连接,模拟连接成功"); + _currentDeviceId = deviceId; + _isConnected = true; + _connectionStatus = ConnectionStatus.Connected; + UpdateConnectionStatus(ConnectionStatus.Connected, "设计模式:设备模拟连接成功"); + return; + } + // 取消之前的连接操作 if (_connectCancellationTokenSource != null) { @@ -2665,7 +2766,14 @@ namespace JoyD.Windows.CS.Toprie /// 开始心跳检测 /// private void StartHeartbeat() - { + { + // 在设计模式下,跳过实际的心跳检测 + if (IsDesignMode) + { + Log("设计模式下跳过实际的心跳检测"); + return; + } + // 停止现有的心跳定时器 StopHeartbeat();