04 — 开发计划(T 任务流水线)
版本:v2.0 | 日期:2026-05-30
采用 T 任务流水线 替代按日分步。每个 T 任务是最小可测试单元,流程固定:
分配任务 → 编码实现 → 自测 → Tech Lead 验收 → git push
任务清单总览(21 个 T 任务)
阶段 0:基础设施
| 编号 | 任务 | 涉及文件 |
|---|
| T001 | CMake 项目骨架 + 目录结构 + main 入口 | CMakeLists.txt, src/main.cpp, include/, src/ 各子目录 |
| T002 | 分级日志系统 | src/utils/Logger.cpp |
阶段 1:通信层
| 编号 | 任务 | 涉及文件 |
|---|
| T003 | IChannel 接口 + SerialChannel + TcpChannel | include/IChannel.h, src/communication/ |
| T004 | ChannelManager(连接/断开/指数退避重连) | src/communication/ChannelManager.cpp |
阶段 2:协议层
| 编号 | 任务 | 涉及文件 |
|---|
| T005 | Frame 结构 + CRC16-CCITT + ProtocolDecoder 状态机 | include/Frame.h, src/protocol/ |
| T006 | 单线程集成:Channel → Decoder → 终端打印 DataPoint | main.cpp 临时代码,串联 T003–T005 |
阶段 3:数据层
| 编号 | 任务 | 涉及文件 |
|---|
| T007 | DataPoint 结构 + DataBuffer 环形缓冲(QMutex) | include/DataPoint.h, src/data/DataBuffer.cpp |
| T008 | DatabaseManager(建表+WAL+批量写入+查询+清理) | src/data/DatabaseManager.cpp |
阶段 4:UI 层
| 编号 | 任务 | 涉及文件 |
|---|
| T009 | DataTableModel + MainWindow 右侧 QTableView | src/data/DataTableModel.cpp, src/ui/MainWindow.cpp |
| T010 | RealTimeChart 自绘(坐标轴+曲线+双缓冲+缩放+拖拽) | src/ui/RealTimeChart.cpp |
| T011 | MainWindow 完整布局(QSplitter+工具栏+状态栏+菜单) | src/ui/MainWindow.cpp |
| T012 | 单线程全链路:采集→表格刷新+曲线滚动+DB 写入 | 串联 T006+T011+T008 |
阶段 5:多线程改造
| 编号 | 任务 | 涉及文件 |
|---|
| T013 | SerialWorker + TcpWorker + ParseWorker(moveToThread) | src/worker/ |
| T014 | 三线程信号槽全队列连接 + 生命周期 + 验证 | 修改 MainWindow + Worker 信号槽接线 |
阶段 6:高级功能 + 收尾
| 编号 | 任务 | 涉及文件 |
|---|
| T015 | HistoryPlayer(QSlider 时间轴+播放/暂停+速度) | src/ui/HistoryPlayer.cpp |
| T016 | CSV 导出(时间范围+通道选择+QFileDialog) | src/ui/ExportDialog.cpp |
| T017 | 暗色主题 QSS + About 对话框 | resources/dark_theme.qss, src/ui/AboutDialog.cpp |
| T018 | 心跳 + 握手协议(帧 0x02~0x05) | 扩展 ProtocolDecoder + ChannelManager 心跳定时器 |
| T019 | Python 模拟器工具(simulator.py) | tools/simulator.py |
| T020 | 代码质量 pass(clang-tidy + 智能指针 + 裸 new/delete 清查) | 全项目 |
| T021 | README 截图更新 + git tag v1.0 | README.md |
依赖图
T001 ──→ T002
│
├──→ T003 ──→ T004 ──────────────┐
│ │
├──→ T005 ────────────────────────┤
│ ▼
├──→ T007 ───────────┐ T006 ← 里程碑 ① 端到端解码
│ │ │
├──→ T008 ───────────┤ │
│ ▼ ▼
│ T009 T012 ← 里程碑 ② 单线程全链路
│ │ │
│ ▼ │
│ T010 ────┐ │
│ │ │ │
│ ▼ │ │
│ T011 ────┤ │
│ │ │
│ ▼ │
│ T013 ← T012 │
│ │ │
│ ▼ │
│ T014 ← 里程碑 ③ 多线程稳定
│ │
│ ┌─────────────┼─────────────┐
│ ▼ ▼ ▼
│ T015 T016 T018
│ (回放) (导出) (心跳握手)
│ │ │ │
│ └─────────────┼─────────────┘
│ ▼
│ T017 (主题+About)
│ │
└───────────────── T020 (代码质量)
│
T019 │ (模拟器,独立进行)
▼
T021 ← 里程碑 ④ 发版
四个里程碑
| # | 对应任务 | 标志 |
|---|
| ① | T006 完成 | 终端看到 Frame decoded: type=0x01, channels=[123,456,789], crc=OK |
| ② | T012 完成 | 界面曲线滚动 + 表格刷新 + SQLite 落盘,单线程全通 |
| ③ | T014 完成 | 三线程稳定运行,窗口关闭无 QThread 警告 |
| ④ | T021 完成 | git tag v1.0,项目可交付 |
每个 T 任务的标准流程
- 分配 — Tech Lead 在
开发日志记录.md 中填写任务详细 + 验收标准 + 开发建议
- 编码 — 开发者按建议路线实现
- 自测 — 对照验收标准逐条打勾
- 验收 — Tech Lead 审查代码 + 确认标准通过
- 推送 —
git commit -m "Txxx: 标题" && git push origin dev
- 记录 — 在日志中补全 Bug 解决、知识点回顾、核心代码
风险与应对
| 风险 | 概率 | 影响 | 应对 |
|---|
| 串口硬件不可用 | 中 | 高 | 使用 socat 虚拟串口对,开发完全不受影响 |
| 自定义曲线性能不达标 | 中 | 高 | 降级为 QChart 方案(QLineSeries),放弃自绘 |
| 多线程出现死锁 | 低 | 高 | 所有数据传递用队列信号槽,不用共享内存+锁,从设计上杜绝死锁 |
| 时间不够 | 中 | 中 | 阶段 5/6 功能可裁剪:砍掉心跳握手(T018),回放降级为纯查询(T015 简化) |