修复连接不稳定问题

This commit is contained in:
zqm
2026-01-06 13:34:51 +08:00
parent 4dd080f917
commit a1cb79a194
2 changed files with 13 additions and 48 deletions

View File

@@ -312,7 +312,6 @@ namespace JoyD.Windows.CS.Toprie
DeviceManager.IsDesignMode = DesignMode; DeviceManager.IsDesignMode = DesignMode;
Console.WriteLine($"相机控件设计模式状态已更新: {DesignMode}"); Console.WriteLine($"相机控件设计模式状态已更新: {DesignMode}");
} }
/// <summary> /// <summary>
/// 更新InfoImage显示 - 按照用户要求的详细步骤: /// 更新InfoImage显示 - 按照用户要求的详细步骤:
/// 1. 以透明色清空Info /// 1. 以透明色清空Info
@@ -397,6 +396,7 @@ namespace JoyD.Windows.CS.Toprie
new RectangleF(0, BUFFER_HEIGHT / 3, BUFFER_WIDTH, BUFFER_HEIGHT / 3), new RectangleF(0, BUFFER_HEIGHT / 3, BUFFER_WIDTH, BUFFER_HEIGHT / 3),
format); format);
} }
Console.WriteLine($"当前状态:{text}");
} }
} }

View File

@@ -367,9 +367,9 @@ namespace JoyD.Windows.CS.Toprie
private Thread _temperatureProcessingThread; // 温度数据处理线程 private Thread _temperatureProcessingThread; // 温度数据处理线程
private volatile bool _shouldStopProcessing = false; // 控制处理线程停止的标志 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; private readonly bool _isDisposed = false;
// 图像模式 // 图像模式
@@ -2728,34 +2728,9 @@ namespace JoyD.Windows.CS.Toprie
if (!_isDisposed && _connectionStatus == ConnectionStatus.Connected) if (!_isDisposed && _connectionStatus == ConnectionStatus.Connected)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检测到连接已断开: _connectionStatus={_connectionStatus}, isStillConnected={isStillConnected}, _isInitialized={_isInitialized}"); Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionWrapper() - 检测到连接已断开: _connectionStatus={_connectionStatus}, isStillConnected={isStillConnected}, _isInitialized={_isInitialized}");
// 断开连接时重置初始化状态SDK实例 // 断开连接时,只重置初始化状态,不立即释放SDK实例
// 保留SDK实例可以避免下次连接时重新创建的开销
_isInitialized = false; _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, "连接已断开:设备离线"); UpdateConnectionStatus(ConnectionStatus.Disconnected, "连接已断开:设备离线");
@@ -2798,22 +2773,17 @@ namespace JoyD.Windows.CS.Toprie
// 注意此方法被CheckConnectionWrapper调用已经在线程安全的上下文中 // 注意此方法被CheckConnectionWrapper调用已经在线程安全的上下文中
// 不需要额外加锁但需要确保SDK实例的访问是线程安全的 // 不需要额外加锁但需要确保SDK实例的访问是线程安全的
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 开始检查连接有效性");
try 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) if (_currentDeviceId == -1)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效返回false"); Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 当前设备ID无效继续执行心跳检测");
return false;
} }
// 优化1: 优先尝试ping设备IP地址这是物理连接断开的最直接检测 // 优化1: 优先尝试ping设备IP地址这是物理连接断开的最直接检测
bool pingResult = PingDevice(_deviceIp); bool pingResult = PingDevice(_deviceIp);
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - ping检测结果: {pingResult}");
if (!pingResult) if (!pingResult)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 设备IP {_deviceIp} 不可达物理连接可能已断开返回false"); Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 设备IP {_deviceIp} 不可达物理连接可能已断开返回false");
@@ -2822,7 +2792,6 @@ namespace JoyD.Windows.CS.Toprie
// 优化2: 系统网络接口检测作为辅助检查,不再作为首要条件 // 优化2: 系统网络接口检测作为辅助检查,不再作为首要条件
bool networkAvailable = IsNetworkAvailable(); bool networkAvailable = IsNetworkAvailable();
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 网络可用性检测结果: {networkAvailable}");
if (!networkAvailable) if (!networkAvailable)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 警告: 系统网络连接不可用但ping检测通过"); 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 = new A8SDK(_deviceIp);
_a8Sdk = newSdk; _a8Sdk = newSdk;
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK实例已创建");
} }
// 增强心跳检测重试机制,提高连接稳定性 // 增强心跳检测重试机制,提高连接稳定性
@@ -2849,18 +2817,15 @@ namespace JoyD.Windows.CS.Toprie
{ {
try try
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测...(尝试 {retry + 1}/{maxHeartbeatRetries + 1})");
heartbeatResult = _a8Sdk.Heartbeat(); heartbeatResult = _a8Sdk.Heartbeat();
// 严格检查返回值,确保连接有效 // 严格检查返回值,确保连接有效
if (heartbeatResult == 1) // V8.Heartbeat()方法返回1表示成功 if (heartbeatResult == 1) // V8.Heartbeat()方法返回1表示成功
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测成功");
break; break;
} }
else if (retry < maxHeartbeatRetries) else if (retry < maxHeartbeatRetries)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK心跳检测失败返回代码: {heartbeatResult}等待500ms后重试...");
Thread.Sleep(500); // 增加重试间隔到500ms Thread.Sleep(500); // 增加重试间隔到500ms
} }
else else
@@ -2878,6 +2843,7 @@ namespace JoyD.Windows.CS.Toprie
if (heartbeatResult == 1) if (heartbeatResult == 1)
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接成功"); Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - SDK重新连接成功");
return true; // 重新连接成功返回true
} }
else else
{ {
@@ -2885,9 +2851,8 @@ namespace JoyD.Windows.CS.Toprie
} }
} }
} }
catch (Exception ex) catch
{ {
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] CheckConnectionValidity() - 心跳检测异常: {ex.Message}");
if (retry < maxHeartbeatRetries) if (retry < maxHeartbeatRetries)
{ {
Thread.Sleep(500); // 增加重试间隔到500ms Thread.Sleep(500); // 增加重试间隔到500ms