# 主应用进程 m_busCore 使用分析 ## 📋 概述 本文档分析主应用进程 (`soft_bus`) 是否还需要 `m_busCore` (DeviceBusCore 实例),以及在分离架构中的使用场景。 ## 🔍 当前使用场景 ### 1. 数据写入操作(需要写入数据库) #### SerialManager 和 CanManager - **位置**: `src/serial_manager/`, `src/can_manager/` - **用途**: - `storeRawData()` - 存储原始数据到数据库 - `storeBusMessage()` - 存储总线消息到数据库 - `registerDevice()` - 注册设备到数据库 - `updateDevice()` - 更新设备信息到数据库 - `updateDeviceStatus()` - 更新设备状态到数据库 - **说明**: `SerialManager` 和 `CanManager` 在主应用中运行,负责设备发现、数据接收和存储 #### SerialDockPage - **位置**: `src/view_serial/serialdockpage.cpp` - **用途**: - `updateDevice()` - 更新设备配置(串口配置、Modbus配置) - **说明**: 用户修改设备配置后,需要更新到数据库 ### 2. 数据查询操作(需要读取数据库) #### UI 组件 - **RawDataTableWidget**: 查询原始数据 (`queryRawData()`) - **BusDataTableWidget**: 查询总线消息 (`queryBusMessages()`) - **DeviceLogDialog**: 查询设备信息和历史数据 - **MessageViewerWidget**: 查询设备列表和数据 #### 设备信息查询 - **已修改**: `getDeviceInfoByPortname()` 已改为通过 `SoftBusAPI` 从守护进程获取 - **仍需使用**: `getDeviceInfo(deviceId)` 用于通过设备ID查询(UI显示) ### 3. 信号连接(UI 更新) - `deviceRegistered` - 设备注册信号 - `deviceUnregistered` - 设备注销信号 - `busMessageStored` - 总线消息存储信号 - `rawDataStored` - 原始数据存储信号 这些信号用于实时更新UI,当数据写入数据库时触发。 ## 🏗️ 架构分析 ### 当前架构 ``` 主应用进程 (soft_bus) ├── CoreService │ └── DeviceBusCore (m_busCore) │ ├── 数据库连接 (soft_bus_db) │ ├── 设备管理(内存缓存) │ └── 数据存储/查询 ├── SerialManager │ └── 需要 m_busCore 存储数据 ├── CanManager │ └── 需要 m_busCore 存储数据 └── UI 组件 └── 需要 m_busCore 查询数据和连接信号 守护进程 (soft_bus_daemon) ├── CoreService │ └── DeviceBusCore │ ├── 数据库连接 (soft_bus_db) [共享] │ ├── 设备管理(内存缓存) │ └── 数据存储/查询 └── 设备扫描和管理 ``` ### 数据库共享 两个进程共享同一个 SQLite 数据库文件 `soft_bus_db`: - ✅ 数据持久化共享(设备注册、消息存储等) - ✅ SQLite 自动处理并发访问 - ❌ 内存状态不共享(每个进程的设备列表缓存独立) ## ✅ 结论:主应用仍然需要 m_busCore ### 需要保留的原因 1. **数据存储需求** - `SerialManager` 和 `CanManager` 在主应用中运行,需要直接写入数据库 - 设备配置更新需要写入数据库 - 虽然守护进程也管理设备,但主应用的 Manager 也需要存储数据 2. **数据查询需求** - UI 组件需要查询数据库显示历史数据 - 虽然设备信息可以从守护进程获取,但数据查询仍需要直接访问数据库 3. **信号连接需求** - UI 需要实时响应数据存储事件 - `DeviceBusCore` 的信号机制用于通知UI更新 4. **向后兼容** - 支持"仅运行主应用"模式(不启动守护进程) - 主应用可以独立运行 ### 使用建议 1. **设备信息获取** - ✅ **已修改**: 使用 `SoftBusAPI::getDeviceByPortName()` 从守护进程获取 - ✅ **保留**: `m_busCore->getDeviceInfo(deviceId)` 用于通过ID查询(UI显示) 2. **数据存储** - ✅ **保留**: `SerialManager` 和 `CanManager` 继续使用 `m_busCore` 存储数据 - ✅ **保留**: 设备配置更新继续使用 `m_busCore->updateDevice()` 3. **数据查询** - ✅ **保留**: UI 组件继续使用 `m_busCore` 查询数据 - 数据库是共享的,查询结果是一致的 4. **信号连接** - ✅ **保留**: UI 组件继续连接 `m_busCore` 的信号 - 注意:主应用和守护进程各自发出信号,UI只响应主应用的信号 ## ⚠️ 注意事项 ### 1. 内存状态不同步 - 主应用的 `m_busCore` 和守护进程的 `DeviceBusCore` 有独立的内存缓存 - 设备注册/更新会写入数据库,但内存状态可能不同步 - **解决方案**: 设备信息查询优先从守护进程获取(已实现) ### 2. 信号重复 - 主应用和守护进程都会发出 `deviceRegistered`、`busMessageStored` 等信号 - UI 只连接主应用的 `m_busCore` 信号,避免重复处理 ### 3. 数据一致性 - 数据库层面的数据是一致的(SQLite 处理并发) - 内存层面的设备列表可能不同步,但不影响数据存储和查询 ## 📝 总结 | 操作类型 | 是否需要 m_busCore | 说明 | |---------|-------------------|------| | **设备信息获取** | ⚠️ 部分需要 | 通过端口名获取:使用 `SoftBusAPI`(从守护进程)
通过ID获取:使用 `m_busCore`(UI显示) | | **数据存储** | ✅ 需要 | `SerialManager`、`CanManager` 存储数据
设备配置更新 | | **数据查询** | ✅ 需要 | UI 组件查询历史数据 | | **信号连接** | ✅ 需要 | UI 实时更新 | **结论**: 主应用进程**仍然需要** `m_busCore`,主要用于: 1. 数据存储(写入数据库) 2. 数据查询(读取数据库) 3. 信号连接(UI更新) 但设备信息的获取应该优先从守护进程获取(已实现),以确保数据一致性。