Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/开发者指南/代码结构/Main模块.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

16 KiB
Raw Blame History

Main模块

**本文引用的文件** - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp) - [Global.cpp](file://cpp/Main/Global.cpp) - [GeoMative.h](file://h/GeoMative.h) - [DevManager.h](file://h/DevManager.h) - [TdManager.h](file://h/TdManager.h) - [ProManager.h](file://h/ProManager.h) - [ExecManager.h](file://h/ExecManager.h)

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论

引言

本文件聚焦于GeomativeStudio项目的Main模块,系统性阐述CGeoMativeApp作为MFC应用程序主类的职责与实现,包括:

  • 应用程序初始化流程(InitInstance)与生命周期管理(ExitInstance
  • 全局变量与全局函数的定义与作用域
  • 各管理器(m_pDevManager、m_pProManager、m_pTdManager、m_pExecManager、m_pSptManager、m_pIOManager)的创建与依赖关系
  • 通过AfxGetApp()全局函数访问应用程序实例并在不同模块间传递调用模式

项目结构

Main模块位于cpp/Main目录,包含两个关键文件:

  • GeoMative.cppMFC应用主类CGeoMativeApp的实现,涵盖初始化、消息处理、退出清理等
  • Global.cpp:全局变量、全局函数与跨模块共享的数据结构定义
graph TB
subgraph "Main模块"
A["GeoMative.cpp<br/>CGeoMativeApp实现"]
B["Global.cpp<br/>全局变量/函数"]
H["GeoMative.h<br/>CGeoMativeApp声明"]
end
subgraph "管理器模块"
D["DevManager.h"]
T["TdManager.h"]
P["ProManager.h"]
E["ExecManager.h"]
end
A --> H
A --> D
A --> T
A --> P
A --> E
B --> A

图表来源

章节来源

核心组件

  • CGeoMativeApp:MFC应用主类,负责应用初始化、主窗口创建、资源加载、全局对象创建、网络与数据库初始化、线程与定时器管理、退出清理等
  • 全局变量与函数:集中定义跨模块使用的全局状态、工具函数、线程入口与回调等
  • 管理器集合:设备、项目、测试数据、执行、脚本、IO等管理器,由CGeoMativeApp统一创建与协调

章节来源

架构总览

CGeoMativeApp作为应用入口,承担以下职责:

  • 初始化MFC环境、OLE、控件容器、3D控件支持
  • 设置工作目录、创建缓存目录、加载主框架窗口
  • 建立数据库连接(ADO/ADOX)、初始化日志、诊断信息、跨孔配置
  • 创建各管理器实例并注入数据库连接
  • 读取配置(config.ini)、语言切换、用户登录、网络连接与心跳
  • 启动扫描线程、系统时间线程、定时器
  • 在退出时释放所有资源与线程
classDiagram
class CGeoMativeApp {
+InitInstance() bool
+ExitInstance() int
+PreTranslateMessage(pMsg) bool
+OnFileExit() void
+OnHelpAbout() void
+GetDBPasswordInfo() void
+GetPasswordPtr(map) void
+GetDevPassword(name, info) void
+OnCfgTerrain() void
+GetCfgUrl() bool
+Get2dDataExpStyle() int
-InitalDiagnosisInfo() void
-SetDBAttributeUpdateInfo() void
-ProcConPtrCloseExpect() void
-ParserSigCrossHole(index) bool
-GeCrossHoleCfg() bool
+m_pDevManager : CDevManager*
+m_pProManager : CProManager*
+m_pTdManager : CTdManager*
+m_pExecManager : CExecManager*
+m_pSptManager : CSptManager*
+m_pIOManager : CIOManager*
+m_pConnection : _ConnectionPtr
+m_pCatalog : _CatalogPtr
+m_NetWorkOper : CNetWorkOper
+m_uiUserID : UINT32
+m_ucIsMultiChannel : EN_CHANNEL_INFO
+m_mapCrossHole : map
}
class CDevManager
class CProManager
class CTdManager
class CExecManager
class CSptManager
class CIOManager
CGeoMativeApp --> CDevManager : "创建并持有"
CGeoMativeApp --> CProManager : "创建并持有"
CGeoMativeApp --> CTdManager : "创建并持有"
CGeoMativeApp --> CExecManager : "创建并持有"
CGeoMativeApp --> CSptManager : "创建并持有"
CGeoMativeApp --> CIOManager : "创建并持有"

图表来源

详细组件分析

CGeoMativeApp类与生命周期管理

  • 构造与析构
    • 构造函数初始化各管理器指针为空,清理计数器与路径等成员
    • 析构函数负责释放数据库连接、主窗口、各管理器实例、菜单/加速键资源、COM/临界区等
  • 初始化(InitInstance
    • OLE初始化、控件容器启用、3D控件支持
    • 设置注册表键、设置当前工作目录、创建CACHE目录结构
    • 加载主框架窗口、显示最大化、初始化COM、清空跨孔配置映射
    • 建立数据库连接(ADO/ADOX),设置锁数量上限
    • 初始化网络(WSAStartup)、日志、诊断信息、跨孔配置
    • 密码验证(数据库密码、几何密码)、系统时间线程、数据库升级
    • 创建各管理器实例(Dev/Pro/Td/Exec/Spt/IO),读取config.ini配置(传输方式、用户ID、多通道、语言、时区等)
    • 在线模式:登录对话框、心跳定时器、网络连接、设备通知注册、工作线程启动
    • 离线/USB模式:设备扫描线程、设备链接初始化、MAC地址生成、扫描线程
    • 资源清理与菜单刷新
  • 退出(ExitInstance
    • 注销网络回调、释放主窗口、管理器、关闭数据库连接、释放ADO/ADOX、停止扫描线程、反初始化COM、删除临界区、调用基类退出
sequenceDiagram
participant App as "CGeoMativeApp"
participant Frame as "主框架窗口"
participant DB as "数据库(ADO/ADOX)"
participant Net as "网络(CNetWorkOper)"
participant Th as "线程(扫描/系统时间)"
App->>App : 构造函数初始化
App->>App : InitInstance()
App->>App : OLE/控件容器初始化
App->>Frame : 创建并加载主框架
App->>App : 设置工作目录/CACHE目录
App->>DB : 建立连接/设置锁上限
App->>App : 日志/诊断/跨孔配置初始化
App->>App : 密码验证/系统时间线程
App->>App : 数据库升级
App->>App : 创建管理器实例
App->>App : 读取config.ini/语言切换
alt 在线模式
App->>Net : 初始化/连接/心跳/注册通知
else 离线/USB模式
App->>Th : 启动扫描线程
end
App-->>Frame : 显示并更新窗口
App->>App : ExitInstance()
App->>Th : 释放线程/临界区/COM
App->>DB : 关闭连接/释放ADO/ADOX
App->>Frame : 释放主窗口
App-->>App : 返回基类ExitInstance

图表来源

章节来源

全局变量与全局函数的作用

  • 全局变量
    • 系统语言、UI偏移、传输模式、UI语言、系统时间、扫描标志、MAC地址、设备序列号、PLC/设备ID、时区、在线传输开关、任务状态、时间戳等
    • 设备链接表(aDevLinkTable[256])、扫描临界区(g_ScanTabSection)、系统时间(g_sysCurTime
  • 全局函数
    • 列表排序比较函数(ListStrCompare、SptListStrCompare
    • 消息泵辅助(DoEvent
    • 延迟与事件循环(TransDelay
    • 字符串处理(SplitterString、StatStringCount、GetSubStringInHeadAndTail
    • 数学与信号处理(多项式拟合、积分、二分法求根)
    • 状态文本与编码转换(GetGRStatus、GetGrCodeText、U2G/G2U
    • 时间转换(Tm2GmtStr/Tm2LocalStr、Str2GmtTm/Str2LocalTm
    • 网络序转换(tcp_htonf/tcp_ntohf
    • 在线任务状态文本(OnLineLocalTaskState/OnLineTask
    • 测试失败原因文本(GetTestFailedReason
    • 设备枚举(DeviceEnumCommPort
    • 扫描线程入口(DevLinkScanThreadFunction
    • 系统时间线程入口(GetSysTimeFunction
    • 错误钩子(CBTHookProc

这些全局变量与函数贯穿于设备扫描、网络通信、UI交互、数据处理等模块,确保模块间共享状态与工具能力。

章节来源

管理器创建与依赖关系

  • 管理器创建顺序与注入
    • 数据库连接(m_pConnection)与目录(m_pCatalog)在InitInstance中建立
    • 管理器构造函数均接收_connection指针,确保所有管理器共享同一数据库上下文
  • 管理器职责概览
    • CDevManager:设备发现、在线/离线设备管理、远程设备集合维护
    • CProManager:工程/测区管理、DMS树构建与同步、默认测区创建
    • CTdManager:测试数据导入/导出、在线同步、2D/3D转换
    • CExecManager:测试执行流程控制(2D/CE电阻率测试)
    • CSptManager:脚本管理(2D/3D/CE
    • CIOManagerIO与外部接口(含数据库与Catalog)
  • 依赖关系
    • CGeoMativeApp持有各管理器指针,负责创建与销毁
    • 各管理器内部持有_connection指针,避免重复连接
    • 网络层(CNetWorkOper)与扫描线程(DevLinkScanThreadFunction)通过CGeoMativeApp间接协作
flowchart TD
Start(["InitInstance入口"]) --> DBInit["建立数据库连接<br/>ADO/ADOX"]
DBInit --> CreateMgrs["创建管理器实例<br/>Dev/Pro/Td/Exec/Spt/IO"]
CreateMgrs --> ConfigRead["读取config.ini<br/>传输方式/用户ID/语言/时区"]
ConfigRead --> OnlineCheck{"在线模式?"}
OnlineCheck --> |是| NetInit["网络初始化/连接/心跳/注册"]
OnlineCheck --> |否| ScanThread["启动扫描线程"]
NetInit --> SysTime["启动系统时间线程"]
ScanThread --> SysTime
SysTime --> Done(["初始化完成"])

图表来源

章节来源

AfxGetApp()的应用与模块间调用模式

  • theApp全局实例
    • Global.cpp中声明并定义CGeoMativeApp theApp,供全工程使用
    • 各模块通过extern声明theApp,从而在任意位置访问CGeoMativeApp实例
  • AfxGetApp()调用模式
    • 在扫描线程入口DevLinkScanThreadFunction中,通过AfxGetApp()->GetMainWnd()向主窗口发送WM_NEWLINK/WM_DETECT_LINE消息
    • 在线任务状态文本函数OnLineLocalTaskState/OnLineTask中,根据UI语言选择中文或英文提示
  • 调用链示意
sequenceDiagram
participant Thread as "扫描线程"
participant App as "CGeoMativeApp"
participant MainWnd as "主窗口"
participant Handlers as "消息处理器"
Thread->>App : AfxGetApp()
App-->>Thread : 返回theApp实例
Thread->>App : GetMainWnd()
App-->>Thread : 返回主窗口指针
Thread->>MainWnd : SendMessage(WM_NEWLINK/WM_DETECT_LINE)
MainWnd->>Handlers : 分发消息并处理

图表来源

章节来源

依赖关系分析

  • 组件耦合
    • CGeoMativeApp与各管理器之间为“聚合”关系,通过指针持有,便于解耦与独立扩展
    • 管理器之间无直接依赖,通过CGeoMativeApp协调,降低环状依赖风险
  • 外部依赖
    • 数据库:ADO/ADOX连接与事务
    • 网络:CNetWorkOper封装的网络操作与线程
    • 系统服务:COM初始化/反初始化、线程与临界区、文件系统(CACHE目录)
  • 潜在循环依赖
    • 通过全局theApp与AfxGetApp()访问主类,避免了管理器对主类的直接包含,降低循环依赖概率
graph LR
App["CGeoMativeApp"] --> DevMgr["CDevManager"]
App --> ProMgr["CProManager"]
App --> TdMgr["CTdManager"]
App --> ExecMgr["CExecManager"]
App --> SptMgr["CSptManager"]
App --> IOMgr["CIOManager"]
App --> Net["CNetWorkOper"]
App --> DB["ADO/ADOX 连接"]

图表来源

章节来源

性能考量

  • 数据库连接与锁
    • 初始化时设置最大锁数量,避免高并发下的锁竞争
  • 线程与临界区
    • 设备扫描线程与系统时间线程分离,扫描线程使用临界区保护共享表
  • 网络与心跳
    • 在线模式下启用心跳定时器与网络工作线程,需注意线程安全与异常恢复
  • 文件系统
    • 启动阶段创建CACHE目录与子目录,避免运行期频繁创建导致的性能抖动

[本节为通用指导,无需具体文件分析]

故障排查指南

  • 数据库连接失败
    • 现象:InitInstance中捕获_com_error并提示连接失败
    • 排查:确认ACCDB路径、密码、Jet OLEDB驱动安装情况
  • 网络初始化失败
    • 现象:WSAStartup失败或网络连接失败
    • 排查:检查IP/端口配置、防火墙、网络连通性
  • 扫描线程创建失败
    • 现象:创建扫描线程失败或无法发现设备
    • 排查:检查传输模式、USB/GD设备状态、权限与驱动
  • 退出异常
    • 现象:ExitInstance中关闭连接抛出异常
    • 排查:查看错误钩子与日志,确保线程安全关闭与资源释放顺序

章节来源

结论

CGeoMativeApp作为GeomativeStudio的主入口,承担了完整的应用生命周期管理职责。通过清晰的初始化流程、严格的资源管理与模块化设计,实现了数据库、网络、设备扫描、UI交互等功能的有序协同。全局变量与函数为跨模块共享提供了基础,而theApp/AfxGetApp()的使用模式确保了模块间松耦合与可维护性。建议在后续演进中持续关注线程安全、异常恢复与性能优化,以提升整体稳定性与用户体验。