notepad++调用外部编译器卡在“正在运行”状态,根本原因是windows默认子进程继承父进程普通优先级,易被后台服务抢占cpu;应使用start /high显式提升优先级,或linux下用nice降低notepad++自身优先级以礼让gcc。

Notepad++ 调用外部编译器卡在“正在运行”状态
这不是 Notepad++ 本身卡死,而是它启动的编译进程(如 g++.exe、python.exe)被系统降权,或与 Notepad++ 主进程争抢资源导致响应延迟。常见表现是:点击“运行”后界面冻结数秒、输出窗口无反应、任务管理器里能看到子进程但 CPU 占用为 0%。
根本原因在于 Windows 默认对 GUI 进程启动的子进程沿用父进程优先级(通常是 NORMAL_PRIORITY_CLASS),而编译类任务需要持续计算,低优先级下容易被后台服务(如 Windows Update、杀毒扫描)抢占 CPU 时间片。
- 验证方式:启动编译后立即打开任务管理器 → 详细信息 → 找到
g++.exe或对应编译器进程 → 右键 → “设置优先级” → 改为“高”,观察是否立刻开始输出 - 不要直接设为“实时”,这会导致系统 UI 假死,尤其在多核负载不均时
- 若你用的是 NppExec 插件调用命令,它默认不继承父进程优先级策略,需显式加参数
用 NppExec 设置编译进程优先级(Windows)
NppExec 是 Notepad++ 最常用的外部工具插件,但它默认以普通权限启动子进程。想让 gcc 或 javac 快速响应,必须手动注入优先级控制逻辑。
在 NppExec 对话框中,把原本类似:cmd /c gcc -o $(NAME_PART).exe $(FILE_NAME)
改成:
cmd /c start "compile" /high gcc -o "$(NAME_PART).exe" "$(FILE_NAME)"
关键点:
-
start是 Windows 命令行启动新会话的关键字,必须带引号包围的窗口标题(哪怕空着也要写"") -
/high参数才能真正提升进程优先级;/normal、/low也可用,但别省略 - 路径含空格时,
"$(FILE_NAME)"的双引号不能少,否则start会把空格后内容误认为新参数 - 避免用
/realtime—— 它会让编译进程锁死一个 CPU 核,Notepad++ 主线程反而卡住
Linux 下 Wine 运行 Notepad++ 调用 gcc 响应慢
在 CentOS 或其他 Linux 发行版中通过 Wine 运行 Notepad++,再调用本地 gcc,本质是跨层调用:Wine 模拟的 Windows 进程 → shell → 真实 Linux 进程。这个链路默认无优先级透传,且 Wine 自身调度开销大。
解决思路不是调 gcc,而是压低 Wine 进程干扰:
- 启动 Notepad++ 前先用
nice -n 19降低其优先级:nice -n 19 wine ~/.wine/drive_c/Program\ Files/Notepad++/notepad++.exe - 这样能让它“礼让”后续 fork 出的
gcc进程,后者自动获得0优先级(即更高) - 禁用 NppExec 中所有“等待进程结束”以外的钩子(比如“执行后自动切换到输出面板”),减少 Wine GUI 线程阻塞
- 确认
gcc不是通过wine cmd /c gcc...启动 —— 这会多一层 Wine 解释器,直接调原生命令更稳
为什么 psutil.PID.nice() 在 Notepad++ 插件里无效
有人尝试用 PythonScript 插件调 psutil.Process(pid).nice(10) 修改编译进程优先级,结果没用。原因很实在:
- PythonScript 插件运行在 Notepad++ 主进程内,所有
os.spawn*或subprocess.Popen启动的子进程,在 Windows 上默认继承父进程的NORMAL_PRIORITY_CLASS,nice()对 Windows 进程类无效(它只影响 Unix-like 的 nice 值) - 即使你在子进程启动后立刻用
psutil获取其 PID 并调.nice(),也大概率失败:Windows 要求调用方有SE_INC_BASE_PRIORITY_NAME权限,普通用户进程拿不到 - 真正有效的做法,还是回到
start /high或 Linux 下用renice -n -5 -p $PID配合子进程捕获逻辑
优先级调整不是万能胶,它只解决“该算的时候不让它等”。如果编译器本身要读 GB 级头文件、或 Notepad++ 正在后台解析大日志,再高的优先级也救不了 IO 瓶颈 —— 这时候得关插件、切只读模式、或者换 VS Code + WSL2。











