# 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.cpp:MFC应用主类CGeoMativeApp的实现,涵盖初始化、消息处理、退出清理等 - Global.cpp:全局变量、全局函数与跨模块共享的数据结构定义 ```mermaid graph TB subgraph "Main模块" A["GeoMative.cpp
CGeoMativeApp实现"] B["Global.cpp
全局变量/函数"] H["GeoMative.h
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 ``` 图表来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1-L120) - [Global.cpp](file://cpp/Main/Global.cpp#L1-L60) - [GeoMative.h](file://h/GeoMative.h#L115-L182) - [DevManager.h](file://h/DevManager.h#L1-L69) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ProManager.h](file://h/ProManager.h#L1-L77) - [ExecManager.h](file://h/ExecManager.h#L1-L42) 章节来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1-L120) - [Global.cpp](file://cpp/Main/Global.cpp#L1-L60) - [GeoMative.h](file://h/GeoMative.h#L115-L182) ## 核心组件 - CGeoMativeApp:MFC应用主类,负责应用初始化、主窗口创建、资源加载、全局对象创建、网络与数据库初始化、线程与定时器管理、退出清理等 - 全局变量与函数:集中定义跨模块使用的全局状态、工具函数、线程入口与回调等 - 管理器集合:设备、项目、测试数据、执行、脚本、IO等管理器,由CGeoMativeApp统一创建与协调 章节来源 - [GeoMative.h](file://h/GeoMative.h#L115-L182) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210) - [Global.cpp](file://cpp/Main/Global.cpp#L20-L70) ## 架构总览 CGeoMativeApp作为应用入口,承担以下职责: - 初始化MFC环境、OLE、控件容器、3D控件支持 - 设置工作目录、创建缓存目录、加载主框架窗口 - 建立数据库连接(ADO/ADOX)、初始化日志、诊断信息、跨孔配置 - 创建各管理器实例并注入数据库连接 - 读取配置(config.ini)、语言切换、用户登录、网络连接与心跳 - 启动扫描线程、系统时间线程、定时器 - 在退出时释放所有资源与线程 ```mermaid 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 : "创建并持有" ``` 图表来源 - [GeoMative.h](file://h/GeoMative.h#L115-L182) - [DevManager.h](file://h/DevManager.h#L1-L69) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ProManager.h](file://h/ProManager.h#L1-L77) - [ExecManager.h](file://h/ExecManager.h#L1-L42) ## 详细组件分析 ### 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、删除临界区、调用基类退出 ```mermaid 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 ``` 图表来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L211-L420) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737) 章节来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L211-L420) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737) ### 全局变量与全局函数的作用 - 全局变量 - 系统语言、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交互、数据处理等模块,确保模块间共享状态与工具能力。 章节来源 - [Global.cpp](file://cpp/Main/Global.cpp#L20-L120) - [Global.cpp](file://cpp/Main/Global.cpp#L120-L320) - [Global.cpp](file://cpp/Main/Global.cpp#L320-L600) - [Global.cpp](file://cpp/Main/Global.cpp#L600-L1000) - [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1539) ### 管理器创建与依赖关系 - 管理器创建顺序与注入 - 数据库连接(m_pConnection)与目录(m_pCatalog)在InitInstance中建立 - 管理器构造函数均接收_connection指针,确保所有管理器共享同一数据库上下文 - 管理器职责概览 - CDevManager:设备发现、在线/离线设备管理、远程设备集合维护 - CProManager:工程/测区管理、DMS树构建与同步、默认测区创建 - CTdManager:测试数据导入/导出、在线同步、2D/3D转换 - CExecManager:测试执行流程控制(2D/CE电阻率测试) - CSptManager:脚本管理(2D/3D/CE) - CIOManager:IO与外部接口(含数据库与Catalog) - 依赖关系 - CGeoMativeApp持有各管理器指针,负责创建与销毁 - 各管理器内部持有_connection指针,避免重复连接 - 网络层(CNetWorkOper)与扫描线程(DevLinkScanThreadFunction)通过CGeoMativeApp间接协作 ```mermaid flowchart TD Start(["InitInstance入口"]) --> DBInit["建立数据库连接
ADO/ADOX"] DBInit --> CreateMgrs["创建管理器实例
Dev/Pro/Td/Exec/Spt/IO"] CreateMgrs --> ConfigRead["读取config.ini
传输方式/用户ID/语言/时区"] ConfigRead --> OnlineCheck{"在线模式?"} OnlineCheck --> |是| NetInit["网络初始化/连接/心跳/注册"] OnlineCheck --> |否| ScanThread["启动扫描线程"] NetInit --> SysTime["启动系统时间线程"] ScanThread --> SysTime SysTime --> Done(["初始化完成"]) ``` 图表来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642) - [DevManager.h](file://h/DevManager.h#L1-L69) - [ProManager.h](file://h/ProManager.h#L1-L77) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ExecManager.h](file://h/ExecManager.h#L1-L42) 章节来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642) - [DevManager.h](file://h/DevManager.h#L1-L69) - [ProManager.h](file://h/ProManager.h#L1-L77) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ExecManager.h](file://h/ExecManager.h#L1-L42) ### AfxGetApp()的应用与模块间调用模式 - theApp全局实例 - Global.cpp中声明并定义CGeoMativeApp theApp,供全工程使用 - 各模块通过extern声明theApp,从而在任意位置访问CGeoMativeApp实例 - AfxGetApp()调用模式 - 在扫描线程入口DevLinkScanThreadFunction中,通过AfxGetApp()->GetMainWnd()向主窗口发送WM_NEWLINK/WM_DETECT_LINE消息 - 在线任务状态文本函数OnLineLocalTaskState/OnLineTask中,根据UI语言选择中文或英文提示 - 调用链示意 ```mermaid 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 : 分发消息并处理 ``` 图表来源 - [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1166) - [Global.cpp](file://cpp/Main/Global.cpp#L20-L30) 章节来源 - [Global.cpp](file://cpp/Main/Global.cpp#L20-L30) - [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1166) ## 依赖关系分析 - 组件耦合 - CGeoMativeApp与各管理器之间为“聚合”关系,通过指针持有,便于解耦与独立扩展 - 管理器之间无直接依赖,通过CGeoMativeApp协调,降低环状依赖风险 - 外部依赖 - 数据库:ADO/ADOX连接与事务 - 网络:CNetWorkOper封装的网络操作与线程 - 系统服务:COM初始化/反初始化、线程与临界区、文件系统(CACHE目录) - 潜在循环依赖 - 通过全局theApp与AfxGetApp()访问主类,避免了管理器对主类的直接包含,降低循环依赖概率 ```mermaid 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 连接"] ``` 图表来源 - [GeoMative.h](file://h/GeoMative.h#L115-L182) - [DevManager.h](file://h/DevManager.h#L1-L69) - [ProManager.h](file://h/ProManager.h#L1-L77) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ExecManager.h](file://h/ExecManager.h#L1-L42) 章节来源 - [GeoMative.h](file://h/GeoMative.h#L115-L182) - [DevManager.h](file://h/DevManager.h#L1-L69) - [ProManager.h](file://h/ProManager.h#L1-L77) - [TdManager.h](file://h/TdManager.h#L1-L109) - [ExecManager.h](file://h/ExecManager.h#L1-L42) ## 性能考量 - 数据库连接与锁 - 初始化时设置最大锁数量,避免高并发下的锁竞争 - 线程与临界区 - 设备扫描线程与系统时间线程分离,扫描线程使用临界区保护共享表 - 网络与心跳 - 在线模式下启用心跳定时器与网络工作线程,需注意线程安全与异常恢复 - 文件系统 - 启动阶段创建CACHE目录与子目录,避免运行期频繁创建导致的性能抖动 [本节为通用指导,无需具体文件分析] ## 故障排查指南 - 数据库连接失败 - 现象:InitInstance中捕获_com_error并提示连接失败 - 排查:确认ACCDB路径、密码、Jet OLEDB驱动安装情况 - 网络初始化失败 - 现象:WSAStartup失败或网络连接失败 - 排查:检查IP/端口配置、防火墙、网络连通性 - 扫描线程创建失败 - 现象:创建扫描线程失败或无法发现设备 - 排查:检查传输模式、USB/GD设备状态、权限与驱动 - 退出异常 - 现象:ExitInstance中关闭连接抛出异常 - 排查:查看错误钩子与日志,确保线程安全关闭与资源释放顺序 章节来源 - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L293-L310) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L311-L320) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L578-L622) - [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737) - [Global.cpp](file://cpp/Main/Global.cpp#L1168-L1181) ## 结论 CGeoMativeApp作为GeomativeStudio的主入口,承担了完整的应用生命周期管理职责。通过清晰的初始化流程、严格的资源管理与模块化设计,实现了数据库、网络、设备扫描、UI交互等功能的有序协同。全局变量与函数为跨模块共享提供了基础,而theApp/AfxGetApp()的使用模式确保了模块间松耦合与可维护性。建议在后续演进中持续关注线程安全、异常恢复与性能优化,以提升整体稳定性与用户体验。