优化菜单显示和SDK实例管理:1. 菜单仅在连接成功时显示 2. 增强多线程环境下的SDK实例访问安全性
This commit is contained in:
@@ -1169,9 +1169,12 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
// 检查是否处于暂停状态
|
// 检查是否处于暂停状态
|
||||||
bool isPaused = pauseDetectionToolStripMenuItem.Text == "恢复检测";
|
bool isPaused = pauseDetectionToolStripMenuItem.Text == "恢复检测";
|
||||||
|
|
||||||
// 在暂停状态下,隐藏图像模式根菜单和色彩模式菜单
|
// 检查设备是否已连接
|
||||||
|
bool isConnected = _deviceManager != null && _deviceManager.ConnectionStatus == ConnectionStatus.Connected;
|
||||||
|
|
||||||
|
// 在暂停状态或未连接状态下,隐藏图像模式根菜单和色彩模式菜单
|
||||||
// 注意:根菜单隐藏后,其所有子菜单会自动隐藏,不需要单独设置
|
// 注意:根菜单隐藏后,其所有子菜单会自动隐藏,不需要单独设置
|
||||||
if (isPaused)
|
if (isPaused || !isConnected)
|
||||||
{
|
{
|
||||||
// 隐藏图像模式根菜单
|
// 隐藏图像模式根菜单
|
||||||
if (imageModeToolStripMenuItem != null)
|
if (imageModeToolStripMenuItem != null)
|
||||||
@@ -1185,20 +1188,16 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 在非暂停状态下,显示图像模式根菜单
|
// 在非暂停状态且已连接状态下,显示图像模式根菜单
|
||||||
// 注意:根菜单显示后,其所有子菜单会自动显示,不需要单独设置
|
// 注意:根菜单显示后,其所有子菜单会自动显示,不需要单独设置
|
||||||
if (imageModeToolStripMenuItem != null)
|
if (imageModeToolStripMenuItem != null)
|
||||||
imageModeToolStripMenuItem.Visible = true;
|
imageModeToolStripMenuItem.Visible = true;
|
||||||
|
|
||||||
// 在非暂停状态下,显示分隔符
|
// 在非暂停状态且已连接状态下,显示分隔符
|
||||||
toolStripSeparator1.Visible = true;
|
toolStripSeparator1.Visible = true;
|
||||||
|
|
||||||
// 根据当前图像模式控制色彩模式菜单的可见性
|
// 根据当前图像模式控制色彩模式菜单的可见性
|
||||||
if (_deviceManager != null)
|
|
||||||
{
|
|
||||||
colorModeToolStripMenuItem.Visible = _deviceManager.CurrentImageMode == ImageMode.Infrared;
|
colorModeToolStripMenuItem.Visible = _deviceManager.CurrentImageMode == ImageMode.Infrared;
|
||||||
}
|
|
||||||
|
|
||||||
// 清除视频模式菜单项的选中状态
|
// 清除视频模式菜单项的选中状态
|
||||||
thermalModeToolStripMenuItem.Checked = false;
|
thermalModeToolStripMenuItem.Checked = false;
|
||||||
visibleModeToolStripMenuItem.Checked = false;
|
visibleModeToolStripMenuItem.Checked = false;
|
||||||
|
|||||||
@@ -2458,9 +2458,14 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
public void SyncPaletteTypeFromDevice()
|
public void SyncPaletteTypeFromDevice()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
// 使用SDK操作锁保护对_a8Sdk的访问
|
||||||
|
lock (_sdkOperationLock)
|
||||||
{
|
{
|
||||||
// 确保设备已连接且SDK实例有效
|
// 确保设备已连接且SDK实例有效
|
||||||
if (_connectionStatus == ConnectionStatus.Connected && _a8Sdk != null)
|
if (_connectionStatus == ConnectionStatus.Connected && _a8Sdk != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
// 获取当前设备的色彩模式值
|
// 获取当前设备的色彩模式值
|
||||||
int currentValue = _a8Sdk.GetColorPlate();
|
int currentValue = _a8Sdk.GetColorPlate();
|
||||||
@@ -2478,11 +2483,29 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
Log($"警告:设备返回的色彩模式值 {currentValue} 不在枚举定义范围内,使用默认值");
|
Log($"警告:设备返回的色彩模式值 {currentValue} 不在枚举定义范围内,使用默认值");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log($"从设备读取色彩模式时出错: {ex.Message}");
|
||||||
|
// 尝试重新创建SDK实例
|
||||||
|
Log("尝试重新创建SDK实例...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_a8Sdk = new A8SDK(_deviceIp);
|
||||||
|
Log("SDK实例已重新创建");
|
||||||
|
}
|
||||||
|
catch (Exception recreateEx)
|
||||||
|
{
|
||||||
|
Log($"重新创建SDK实例失败: {recreateEx.Message}");
|
||||||
|
}
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log($"同步色彩模式失败:设备未连接或SDK未初始化");
|
Log($"同步色彩模式失败:设备未连接或SDK未初始化");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log($"同步色彩模式时发生异常: {ex.Message}");
|
Log($"同步色彩模式时发生异常: {ex.Message}");
|
||||||
@@ -2515,11 +2538,27 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
// 重试间隔(毫秒)
|
// 重试间隔(毫秒)
|
||||||
const int retryDelayMs = 100;
|
const int retryDelayMs = 100;
|
||||||
|
|
||||||
|
// 确保SDK实例存在,如果不存在则尝试创建
|
||||||
|
if (_a8Sdk == null)
|
||||||
|
{
|
||||||
|
Log("SDK实例为空,尝试创建新实例...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_a8Sdk = new A8SDK(_deviceIp);
|
||||||
|
Log("SDK实例创建成功");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log($"创建SDK实例失败: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 先获取原始值,只读取一次,避免嵌套调用
|
// 先获取原始值,只读取一次,避免嵌套调用
|
||||||
int originalValue = -1;
|
int originalValue = -1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_a8Sdk != null && _connectionStatus == ConnectionStatus.Connected)
|
if (_connectionStatus == ConnectionStatus.Connected)
|
||||||
{
|
{
|
||||||
originalValue = _a8Sdk.Color_plate;
|
originalValue = _a8Sdk.Color_plate;
|
||||||
Log($"成功读取当前色彩模式值: {originalValue}");
|
Log($"成功读取当前色彩模式值: {originalValue}");
|
||||||
@@ -2528,6 +2567,17 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log($"获取当前色彩模式值时出错: {ex.Message}");
|
Log($"获取当前色彩模式值时出错: {ex.Message}");
|
||||||
|
// 尝试重新创建SDK实例
|
||||||
|
Log("尝试重新创建SDK实例...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_a8Sdk = new A8SDK(_deviceIp);
|
||||||
|
Log("SDK实例已重新创建");
|
||||||
|
}
|
||||||
|
catch (Exception recreateEx)
|
||||||
|
{
|
||||||
|
Log($"重新创建SDK实例失败: {recreateEx.Message}");
|
||||||
|
}
|
||||||
// 即使获取失败,仍尝试设置新值
|
// 即使获取失败,仍尝试设置新值
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2545,8 +2595,24 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 检查对象状态和连接状态
|
// 再次确保SDK实例存在
|
||||||
if (_a8Sdk == null || _connectionStatus != ConnectionStatus.Connected)
|
if (_a8Sdk == null)
|
||||||
|
{
|
||||||
|
Log("SDK实例为空,尝试重新创建...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_a8Sdk = new A8SDK(_deviceIp);
|
||||||
|
Log("SDK实例重新创建成功");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log($"重新创建SDK实例失败: {ex.Message}");
|
||||||
|
continue; // 继续下一次尝试
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查连接状态
|
||||||
|
if (_connectionStatus != ConnectionStatus.Connected)
|
||||||
{
|
{
|
||||||
Log($"色彩模式设置失败: {(attempt > 0 ? "重试中" : "")}SDK实例为空或设备未连接");
|
Log($"色彩模式设置失败: {(attempt > 0 ? "重试中" : "")}SDK实例为空或设备未连接");
|
||||||
Thread.Sleep(retryDelayMs);
|
Thread.Sleep(retryDelayMs);
|
||||||
|
|||||||
Reference in New Issue
Block a user