From 76c61d75df290ea75a024e8a1049018acc094b22 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Mon, 29 Sep 2025 15:20:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=9A=84=E9=87=8D=E5=90=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/devices/device_coordinator.py | 39 ++- backend/main.py | 13 +- frontend/src/renderer/src/views/Detection.vue | 308 +++++++++--------- 3 files changed, 209 insertions(+), 151 deletions(-) diff --git a/backend/devices/device_coordinator.py b/backend/devices/device_coordinator.py index 6c9a2a02..df87bbf2 100644 --- a/backend/devices/device_coordinator.py +++ b/backend/devices/device_coordinator.py @@ -65,6 +65,9 @@ class DeviceCoordinator: # 事件回调 self.event_callbacks: Dict[str, List[Callable]] = defaultdict(list) + # 状态变化回调存储 + self._status_change_callback = None + # 性能统计 self.stats = { 'start_time': None, @@ -78,6 +81,20 @@ class DeviceCoordinator: self.logger.info("设备协调器初始化完成") + def set_status_change_callback(self, callback: Callable): + """ + 设置状态变化回调函数 + + Args: + callback: 状态变化回调函数 + """ + self._status_change_callback = callback + # 为已存在的设备注册回调 + for device_name, device in self.devices.items(): + if device and hasattr(device, 'add_status_change_callback'): + device.add_status_change_callback(callback) + self.logger.info(f"{device_name} 设备状态变化回调已注册") + def initialize(self) -> bool: """ 初始化所有设备 @@ -530,7 +547,7 @@ class DeviceCoordinator: cleanup_start = time.time() self.logger.info(f"正在彻底清理 {device_name} 设备...") - # 断开连接 + # 断开连接但暂时不广播状态变化,避免重启过程中的状态冲突 if hasattr(device, 'disconnect'): try: device.disconnect() @@ -538,6 +555,12 @@ class DeviceCoordinator: except Exception as e: self.logger.warning(f"断开 {device_name} 连接异常: {e}") + # 静默设置设备状态为未连接,不触发状态变化通知 + # 这样可以避免在重启过程中广播中间状态 + if hasattr(device, 'is_connected'): + device.is_connected = False + self.logger.info(f"{device_name} 设备状态已静默更新为未连接(重启过程中)") + # 彻底清理资源 if hasattr(device, 'cleanup'): try: @@ -605,6 +628,12 @@ class DeviceCoordinator: create_time = (time.time() - create_start) * 1000 self.logger.info(f"{device_name} 设备实例重新创建成功 (耗时: {create_time:.1f}ms)") + # 重新注册状态变化回调(如果有的话) + if hasattr(self, '_status_change_callback') and self._status_change_callback: + if hasattr(new_device, 'add_status_change_callback'): + new_device.add_status_change_callback(self._status_change_callback) + self.logger.info(f"{device_name} 设备状态变化回调已重新注册") + except Exception as e: create_time = (time.time() - create_start) * 1000 self.logger.error(f"重新创建 {device_name} 设备实例失败: {e} (耗时: {create_time:.1f}ms)") @@ -624,6 +653,14 @@ class DeviceCoordinator: init_time = (time.time() - init_start) * 1000 self.logger.info(f"{device_name} 设备初始化成功 (耗时: {init_time:.1f}ms)") + # 设备初始化成功后,确保状态广播正确 + # 此时设备应该已经通过initialize()方法中的set_connected(True)触发了状态变化通知 + # 但为了确保状态一致性,我们再次确认状态 + if hasattr(new_device, 'is_connected') and new_device.is_connected: + self.logger.info(f"{device_name} 设备重启后状态确认:已连接") + else: + self.logger.warning(f"{device_name} 设备重启后状态异常:未连接") + # 第六步:如果之前在推流,则启动推流 stream_time = 0 if was_streaming and hasattr(new_device, 'start_streaming'): diff --git a/backend/main.py b/backend/main.py index 82525250..e8507dea 100644 --- a/backend/main.py +++ b/backend/main.py @@ -187,13 +187,15 @@ class AppServer: # 初始化设备协调器(统一管理所有设备) self.logger.info('正在初始化设备协调器...') self.device_coordinator = DeviceCoordinator(self.socketio) + # 设置状态变化回调 + self.device_coordinator.set_status_change_callback(self._on_device_status_change) # 调用初始化方法来初始化设备 if self.device_coordinator.initialize(): self.logger.info('设备协调器初始化完成') # 获取设备管理器实例 self.device_managers = self.device_coordinator.get_device_managers() - # 为每个设备添加状态变化回调 + # 为每个设备添加状态变化回调(双重保险) for device_name, manager in self.device_managers.items(): if manager and hasattr(manager, 'add_status_change_callback'): manager.add_status_change_callback(self._on_device_status_change) @@ -1488,7 +1490,7 @@ class AppServer: 'device_type': device_type, 'message': f'{device_type} 设备重启成功!', 'timestamp': time.time() - }) + }, namespace='/devices') return True else: self.logger.error(f'{device_type} 设备重启失败!') @@ -1497,7 +1499,7 @@ class AppServer: 'device_type': device_type, 'message': f'{device_type} 设备重启失败!', 'timestamp': time.time() - }) + }, namespace='/devices') return False except Exception as e: @@ -1509,7 +1511,7 @@ class AppServer: 'error': str(e), 'message': f'重启 {device_type} 设备时发生异常', 'timestamp': time.time() - }) + }, namespace='/devices') return False @@ -1649,7 +1651,8 @@ class AppServer: def broadcast_all_device_status(self): """广播所有设备状态""" - for device_name, manager in self.device_managers.items(): + current_devices = self.device_coordinator.get_device_managers() + for device_name, manager in current_devices.items(): if manager is not None: try: # 检查设备是否连接(使用is_connected属性) diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index ddf30795..80903a48 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -8,7 +8,6 @@