<?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/%E8%BF%9B%E7%A8%8B%E7%9B%91%E6%8E%A7/</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/%E8%BF%9B%E7%A8%8B%E7%9B%91%E6%8E%A7/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></channel></rss>