process_monitor: C++ 交互式进程监控,让科学计算可控可停

引言 科学计算程序往往需要运行数分钟甚至数小时。在这漫长的等待中,用户常常面临几个痛点: 程序是否在正常运行?进度如何? 发现参数设置有误,能否暂停调整而不是强制终止? 想查看当前中间结果,又不想打断计算流程? process_monitor 是 utilsxx 库中的交互式进程监控组件。它以非侵入式的设计理念,让你只需继承一个基类、重写几个虚函数,就能为任何计算任务赋予暂停/继续/状态查看/安全退出的交互能力。本文将带你彻底掌握它的设计与使用。 一、核心设计:为什么需要 process_monitor? 1.1 传统方案的局限 方案 问题 Ctrl+C 强制终止 丢失中间结果,无法优雅收尾 信号处理(SIGINT) 跨平台差异大,代码复杂 日志文件轮询 实时性差,无法交互控制 独立 GUI 监控 引入重量级依赖,不适合服务器环境 1.2 process_monitor 的设计哲学 非侵入式:你的计算逻辑几乎不用修改,只需在循环中插入一行 wait_for_keyboard() 跨平台:Windows(_kbhit/_getch)和 Unix(termios/select)统一封装 线程安全:键盘监控与计算逻辑分离,通过条件变量同步 可扩展:所有交互行为都是虚函数,可按需重写 1.3 状态机模型 RUNNING --[pause_key]--> PAUSED --[continue_key]--> RUNNING | | |--[quit_key] |--[quit_key] v v STOPPED <----------------- STOPPED 二、快速上手 2.1 最小示例 #include "process_monitor.h" class MyCalculator : public utilsxx::process_monitor { public: void process() override { while (!end_process()) { // 你的计算逻辑... do_calculation_step(); // 每秒钟检查一次键盘输入 wait_for_keyboard(1); } } }; int main() { MyCalculator calc; calc.start_monitoring(); return 0; } 运行后,你可以随时按下: ...

May 10, 2026 · 张壹

UtilsXX: 专为科学计算打造的 C++17 工具库

引言 在科学计算和工程应用领域,C++ 开发者常常面临一个尴尬的局面:标准库提供了基础的数据结构和算法,但面对具体的科研需求——比如读取一个带注释的 CSV 文件、在终端显示一个进度条、解析复杂的配置文件、或者监控一个耗时数小时的计算进程——往往需要自行编写大量"胶水代码"。 UtilsXX 正是为解决这些痛点而生。它是一个基于 C++17 的轻量级工具库,专为地球科学、物理学和工程计算领域设计。不同于 Boost 这样的"全能型"库,UtilsXX 聚焦于科研工作者日常最高频的需求:数据处理、文件读写、终端交互、配置管理、时间计算和物理常数。本文将全面介绍 UtilsXX 的设计理念、核心模块和使用方法,帮助你快速上手并融入自己的项目。 一、设计理念:为什么创建 UtilsXX? 1.1 科研编程的特殊需求 科学计算程序与传统软件工程有显著不同: 数据驱动:大量时间花在读取、清洗、转换各种格式的数据上 长时运行:数值模拟可能持续数小时甚至数天,需要进度反馈和交互控制 参数密集:算法通常有数十个可调参数,需要灵活的配置管理 跨平台协作:代码需要在个人笔记本、工作站和超算集群上无缝运行 快速迭代:研究思路变化快,代码需要易于修改和扩展 1.2 UtilsXX 的设计原则 原则 实践 Header-Only 优先 大部分组件为单头文件,直接 #include 即可使用 零依赖或内嵌依赖 核心模块无外部依赖;第三方库(如 nlohmann/json、toml11)直接内嵌 类型安全 大量使用模板和 static_assert,编译期捕获类型错误 异常友好 统一的 error_handler 错误处理机制,提供清晰的错误信息 跨平台 Windows、Linux、macOS 统一封装,终端操作透明适配 科研导向 内置地球物理常数、WGS84 参数、角度弧度转换等地学常用工具 1.3 与现有生态的关系 UtilsXX 不是要取代谁,而是填补"标准库不够用、重型框架太重"之间的空白: vs 标准库:补充了 CSV/JSON/TOML 解析、进度条、终端控制等缺失功能 vs Boost:更轻量、更聚焦,学习成本更低 vs Python 生态:让你在 C++ 中也能拥有类似 pandas(dsv_table)、tqdm(progress_bar)、argparse(get_option/CLI11)的体验 二、项目概览与快速开始 2.1 目录结构 utilsxx/ ├── lib/ # 核心头文件库 │ ├── vector.hpp # 向量类型与算法 │ ├── matrix.hpp # 轻量级矩阵 │ ├── dsv_table.hpp # 表格数据处理 │ ├── str_utils.hpp # 字符串工具 │ ├── file_utils.hpp # 文件操作 │ ├── get_option.hpp # 配置参数解析 │ ├── progress_bar.hpp # 终端进度条 │ ├── process_monitor.h # 进程监控 │ ├── utc_time.hpp # UTC 时间处理 │ ├── constants.hpp # 数学与物理常数 │ ├── term_utils.hpp # 终端控制 │ ├── json.hpp # JSON 解析(nlohmann/json) │ ├── toml.hpp # TOML 解析(toml11) │ ├── CLI11.hpp # 命令行解析(CLI11) │ ├── indicators.hpp # 高级进度条(indicators) │ ├── error_handler.hpp # 错误处理 │ └── src/ # 少量需要编译的源文件 │ └── process_monitor.cpp ├── demo/ # 示例程序 ├── data/ # 示例数据文件 ├── extra/ # 第三方库示例 ├── CMakeLists.txt # CMake 构建配置 ├── manager.sh # 便捷管理脚本 └── UtilsXXConfig.cmake.in # CMake 包配置模板 2.2 编译安装 UtilsXX 使用 CMake 构建,支持作为子项目或直接安装到系统: ...

May 10, 2026 · 张壹