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; } 运行后,你可以随时按下: ...