fix: monitor worker non-blocking + test fixes

- core/monitor.py: add fast metrics script (0.3s vs 1.4s sleep),
  collect() now defaults to fast=True for responsive UI
- ui/workers.py: MonitorWorker changed from loop mode to single-shot
  (QTimer re-arms next cycle on finished signal, avoids paramiko
  blocking in infinite loop)
- ui/widgets.py: remove debug print from _kick_one_sample
- test_monitor_nonblock.py: fix sample counting by wrapping _on_sample
  instead of disconnecting signals (old approach missed new workers)
- test_process_monitor.py: assertions account for MAX_RENDER_ROWS=200,
  fix MEM% column index (4 not 3) in sort test
This commit is contained in:
Your Name
2026-07-28 22:57:15 +08:00
parent 5e69b1c3e2
commit 5d83348db3
5 changed files with 341 additions and 33 deletions
+8 -5
View File
@@ -61,7 +61,10 @@ def main():
panel.set_host("fake")
panel._proc_data = m["processes"]
panel._apply_proc_filter()
assert panel.proc_table.rowCount() == len(m["processes"])
# 扁平视图受 MAX_RENDER_ROWS 限制
expected_rows = min(len(m["processes"]), panel.MAX_RENDER_ROWS)
assert panel.proc_table.rowCount() == expected_rows, \
f"行数 {panel.proc_table.rowCount()} != 预期 {expected_rows} (总 {len(m['processes'])}, 上限 {panel.MAX_RENDER_ROWS})"
# 验证第一列 (PID) 是数字
pid_text = panel.proc_table.item(0, 0).text()
assert pid_text.isdigit(), f"PID 列不是数字: {pid_text!r}"
@@ -110,7 +113,7 @@ def main():
print(f" ✓ CPU>=10% 过滤后剩 {after_min} 行,全部 CPU≥10%")
panel.proc_min_cpu.setValue(0)
app.processEvents()
assert panel.proc_table.rowCount() == len(m["processes"])
assert panel.proc_table.rowCount() == expected_rows
print(f" ✓ CPU 过滤清空恢复 {panel.proc_table.rowCount()}")
print("[4/5] 搜索过滤")
@@ -130,14 +133,14 @@ def main():
# 清空搜索
panel.proc_search.setText("")
app.processEvents()
assert panel.proc_table.rowCount() == len(m["processes"]), "清空搜索应恢复"
assert panel.proc_table.rowCount() == expected_rows, "清空搜索应恢复"
print(f" ✓ 清空搜索恢复全部 {panel.proc_table.rowCount()}")
# 测试按内存排序
panel.proc_sort_combo.setCurrentIndex(1) # 按 MEM 降序
app.processEvents()
first = panel.proc_table.item(0, 3).text() # MEM% 在第 3
last = panel.proc_table.item(panel.proc_table.rowCount() - 1, 3).text()
first = panel.proc_table.item(0, 4).text() # MEM% 在第 4
last = panel.proc_table.item(panel.proc_table.rowCount() - 1, 4).text()
assert float(first) >= float(last), f"按 MEM 排序失败: {first} < {last}"
print(f" ✓ 按 MEM 排序: 第 1 行 {first}% > 最后行 {last}%")