Mandelbrot 教学示例增强:主线程渲染循环至 ≥1.5s,让界面冻结肉眼可感

实测单帧 820×640@256 单线程仅约 70ms,远低于人眼可感阈值,直接算一帧看不出
「冻结」。故「主线程渲染」按钮改为自适应循环渲染直到累计 ≥ 1500ms(实测 ~23 帧 /
1506ms),上限 100 轮防止极慢机器卡死过久。冻结的本质是事件循环被占用,循环只是
模拟任意一个占着 GUI 线程不返回的耗时操作。

- mandelbrot_widget.cpp:onRenderOnMainThread 改 do-while 循环,标签加「· N 轮」
- README.md:补冻结时长说明与课堂演示技巧
- 设计文档同步:三段式对比章节更新实测数据与冻结本质解释
- 新增 docs/teaching/MULTITHREADING.md:多线程教学要点汇总

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
张宗平
2026-07-09 16:50:46 +08:00
parent 12950da129
commit 993aa30a1c
4 changed files with 391 additions and 9 deletions
@@ -72,8 +72,10 @@ wheelEvent 改 scale/center(以鼠标点为锚,缩放后该点复坐标不
## 5. 三段式对比(教学核心)
- **「主线程渲染」按钮**:槽里同步调用 `renderStrip`整帧(在 GUI 线程,不分块、不丢池),耗时约 1–3s
期间事件循环停摆 → 按钮无响应、窗口拖不动 → 直观复现痛点。算完 `update()` 并显示「主线程渲染 Xms · 界面冻结」
- **「主线程渲染」按钮**:槽里在 GUI 线程同步调用 `renderStrip` 算整帧(不分块、不丢池)
实测单帧 820×640@256 仅约 70ms,不足以肉眼可感,故**自适应循环渲染到累计 ≥ 1500ms**(实测 ~23 帧 / 1506ms
期间事件循环停摆 → 按钮无响应、窗口拖不动 → 直观复现痛点。算完 `update()` 并显示「主线程渲染 Xms · N 轮」。
冻结本质是事件循环被占用,循环只是模拟一个持续 ~1.5s 的耗时操作。
- **「单/多线程」切换**:复用同一套分块逻辑,仅切 `QThreadPool::globalInstance()->setMaxThreadCount(1 或 hardwareConcurrency())`
单线程不卡但慢、多线程不卡且快,耗时标签量化加速比。
- 三段对比让学员一眼看懂:耗时任务必须离开主线程;多线程进一步压榨多核。