<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>科学计算 on 知星悟地</title><link>https://geowisdom.com.cn/tags/%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97/</link><description>Recent content in 科学计算 on 知星悟地</description><generator>Hugo -- 0.153.2</generator><language>en-us</language><lastBuildDate>Sun, 10 May 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://geowisdom.com.cn/tags/%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97/index.xml" rel="self" type="application/rss+xml"/><item><title>process_monitor: C++ 交互式进程监控，让科学计算可控可停</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_process_monitor/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_process_monitor/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;科学计算程序往往需要运行数分钟甚至数小时。在这漫长的等待中，用户常常面临几个痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;程序是否在正常运行？进度如何？&lt;/li&gt;
&lt;li&gt;发现参数设置有误，能否暂停调整而不是强制终止？&lt;/li&gt;
&lt;li&gt;想查看当前中间结果，又不想打断计算流程？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;process_monitor&lt;/code&gt; 是 &lt;a href="https://github.com/geophyxx/utilsxx"&gt;utilsxx&lt;/a&gt; 库中的交互式进程监控组件。它以&lt;strong&gt;非侵入式&lt;/strong&gt;的设计理念，让你只需继承一个基类、重写几个虚函数，就能为任何计算任务赋予&lt;strong&gt;暂停/继续/状态查看/安全退出&lt;/strong&gt;的交互能力。本文将带你彻底掌握它的设计与使用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一核心设计为什么需要-process_monitor"&gt;一、核心设计：为什么需要 process_monitor？&lt;/h2&gt;
&lt;h3 id="11-传统方案的局限"&gt;1.1 传统方案的局限&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt; 强制终止&lt;/td&gt;
&lt;td&gt;丢失中间结果，无法优雅收尾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;信号处理（&lt;code&gt;SIGINT&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;跨平台差异大，代码复杂&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日志文件轮询&lt;/td&gt;
&lt;td&gt;实时性差，无法交互控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;独立 GUI 监控&lt;/td&gt;
&lt;td&gt;引入重量级依赖，不适合服务器环境&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-process_monitor-的设计哲学"&gt;1.2 process_monitor 的设计哲学&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非侵入式&lt;/strong&gt;：你的计算逻辑几乎不用修改，只需在循环中插入一行 &lt;code&gt;wait_for_keyboard()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：Windows（&lt;code&gt;_kbhit&lt;/code&gt;/&lt;code&gt;_getch&lt;/code&gt;）和 Unix（&lt;code&gt;termios&lt;/code&gt;/&lt;code&gt;select&lt;/code&gt;）统一封装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线程安全&lt;/strong&gt;：键盘监控与计算逻辑分离，通过条件变量同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt;：所有交互行为都是虚函数，可按需重写&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-状态机模型"&gt;1.3 状态机模型&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;RUNNING --[pause_key]--&amp;gt; PAUSED --[continue_key]--&amp;gt; RUNNING
| |
|--[quit_key] |--[quit_key]
v v
STOPPED &amp;lt;----------------- STOPPED
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二快速上手"&gt;二、快速上手&lt;/h2&gt;
&lt;h3 id="21-最小示例"&gt;2.1 最小示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;process_monitor.h&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyCalculator&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; utilsxx&lt;span style="color:#f92672"&gt;::&lt;/span&gt;process_monitor {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; process() &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;end_process()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 你的计算逻辑...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; do_calculation_step();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 每秒钟检查一次键盘输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait_for_keyboard(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MyCalculator calc;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; calc.start_monitoring();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行后，你可以随时按下：&lt;/p&gt;</description></item><item><title>UtilsXX: 专为科学计算打造的 C++17 工具库</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_utilsxx/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_utilsxx/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在科学计算和工程应用领域，C++ 开发者常常面临一个尴尬的局面：标准库提供了基础的数据结构和算法，但面对具体的科研需求——比如读取一个带注释的 CSV 文件、在终端显示一个进度条、解析复杂的配置文件、或者监控一个耗时数小时的计算进程——往往需要自行编写大量&amp;quot;胶水代码&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UtilsXX&lt;/strong&gt; 正是为解决这些痛点而生。它是一个基于 C++17 的轻量级工具库，专为地球科学、物理学和工程计算领域设计。不同于 Boost 这样的&amp;quot;全能型&amp;quot;库，UtilsXX 聚焦于科研工作者日常最高频的需求：数据处理、文件读写、终端交互、配置管理、时间计算和物理常数。本文将全面介绍 UtilsXX 的设计理念、核心模块和使用方法，帮助你快速上手并融入自己的项目。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一设计理念为什么创建-utilsxx"&gt;一、设计理念：为什么创建 UtilsXX？&lt;/h2&gt;
&lt;h3 id="11-科研编程的特殊需求"&gt;1.1 科研编程的特殊需求&lt;/h3&gt;
&lt;p&gt;科学计算程序与传统软件工程有显著不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据驱动&lt;/strong&gt;：大量时间花在读取、清洗、转换各种格式的数据上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长时运行&lt;/strong&gt;：数值模拟可能持续数小时甚至数天，需要进度反馈和交互控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数密集&lt;/strong&gt;：算法通常有数十个可调参数，需要灵活的配置管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台协作&lt;/strong&gt;：代码需要在个人笔记本、工作站和超算集群上无缝运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快速迭代&lt;/strong&gt;：研究思路变化快，代码需要易于修改和扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-utilsxx-的设计原则"&gt;1.2 UtilsXX 的设计原则&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;原则&lt;/th&gt;
&lt;th&gt;实践&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Header-Only 优先&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大部分组件为单头文件，直接 &lt;code&gt;#include&lt;/code&gt; 即可使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;零依赖或内嵌依赖&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;核心模块无外部依赖；第三方库（如 nlohmann/json、toml11）直接内嵌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;类型安全&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大量使用模板和 &lt;code&gt;static_assert&lt;/code&gt;，编译期捕获类型错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;异常友好&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;统一的 &lt;code&gt;error_handler&lt;/code&gt; 错误处理机制，提供清晰的错误信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;跨平台&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows、Linux、macOS 统一封装，终端操作透明适配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;科研导向&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;内置地球物理常数、WGS84 参数、角度弧度转换等地学常用工具&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-与现有生态的关系"&gt;1.3 与现有生态的关系&lt;/h3&gt;
&lt;p&gt;UtilsXX 不是要取代谁，而是填补&amp;quot;标准库不够用、重型框架太重&amp;quot;之间的空白：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vs 标准库&lt;/strong&gt;：补充了 CSV/JSON/TOML 解析、进度条、终端控制等缺失功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Boost&lt;/strong&gt;：更轻量、更聚焦，学习成本更低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Python 生态&lt;/strong&gt;：让你在 C++ 中也能拥有类似 pandas（&lt;code&gt;dsv_table&lt;/code&gt;）、tqdm（&lt;code&gt;progress_bar&lt;/code&gt;）、argparse（&lt;code&gt;get_option&lt;/code&gt;/&lt;code&gt;CLI11&lt;/code&gt;）的体验&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二项目概览与快速开始"&gt;二、项目概览与快速开始&lt;/h2&gt;
&lt;h3 id="21-目录结构"&gt;2.1 目录结构&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;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 包配置模板
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-编译安装"&gt;2.2 编译安装&lt;/h3&gt;
&lt;p&gt;UtilsXX 使用 CMake 构建，支持作为子项目或直接安装到系统：&lt;/p&gt;</description></item></channel></rss>