From 42028d93bdc681ded32b221a942e5ac12fd30ede Mon Sep 17 00:00:00 2001 From: Jokul Date: Thu, 23 Jul 2026 00:11:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=80=BB=E9=87=8F=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=B4=AF=E5=8A=A0=E4=BC=9A=E8=AF=9D=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E8=80=8C=E9=9D=9E=E5=8F=96=E8=AE=A1=E6=95=B0=E5=99=A8?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 m_totalDownload = currentRxBytes 直接取活动接口计数器值,切换 网卡时跳变到新接口计数器,网卡重启时归零,语义有误导。 改为 m_totalDownload += rxDeltaClamped 累加会话增量,总计从 0 开始增长,切换网卡不再跳变。跨重启持久化属于后续 #18 的范畴。 --- docs/project-review.md | 5 +++-- src/networkmonitorapplet.cpp | 16 +++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/project-review.md b/docs/project-review.md index cf77ffb..28767d9 100644 --- a/docs/project-review.md +++ b/docs/project-review.md @@ -17,8 +17,9 @@ ~~网卡重启、`/proc/net/dev` 计数器溢出或接口重置时,`currentRxBytes - m_lastRxBytes` 可能为负。代码无任何兜底,QML 会显示负速度。~~ 已在 `calculateSpeed()` 中对 `rxDelta` / `txDelta` 钳制为 0,计数器回绕/接口重置/网卡重启时不再产生负速度。 -**3. "总量统计"语义有误导** -`m_totalDownload = currentRxBytes` 只存储活动接口的当前计数器值,并非真正的累计流量。它会在以下场景跳变:切换网卡(跳到新接口计数器)、网卡重启(归零)、系统重启(归零)。README 宣称"累计上传/下载流量统计",但实际不是跨重启/跨接口的累计。 +**3. ~~"总量统计"语义有误导~~ ✅ 已修复** +~~`m_totalDownload = currentRxBytes` 只存储活动接口的当前计数器值,并非真正的累计流量。~~ +已改为累加会话增量 `m_totalDownload += rxDeltaClamped`,"总计"语义从"活动接口计数器值"变为"本次会话累计流量":从 0 开始增长,切换网卡不再跳变,网卡重启不归零。跨重启持久化属于 #18 的范畴。 **4. 独立窗口不支持深色模式** `AboutWindow.qml`、`SettingsWindow.qml`、`TextColorPicker.qml`、`TrafficChartWindow.qml` 全部硬编码浅色(`#FFFFFF`、`#333333`、`#f5f5f5` 等),不随系统主题适配。而 `networkview.qml` 和 `NetworkPopup.qml` 正确地从 `DockPalette` 派生颜色。deepin 深色模式下这些窗口视觉割裂严重。 diff --git a/src/networkmonitorapplet.cpp b/src/networkmonitorapplet.cpp index 7c104fd..9494877 100644 --- a/src/networkmonitorapplet.cpp +++ b/src/networkmonitorapplet.cpp @@ -372,18 +372,20 @@ void NetworkMonitorApplet::calculateSpeed() // 改为除以真实间隔后,无论定时器抖动如何速度都准确。 const double elapsedSec = (nowMs - m_lastTimestampMs) / 1000.0; - // 更新总量 - m_totalDownload = currentRxBytes; - m_totalUpload = currentTxBytes; - - // 仅当间隔合法时计算速度,避免除零;间隔为 0 时保持上次速度值 + // 仅当间隔合法时计算速度并累加会话流量,避免除零;间隔为 0 时保持上次值 if (elapsedSec > 0) { // 计数器回绕/接口重置时差值可能为负,钳制为 0 避免显示负速度 // 触发场景:网卡重启、/proc/net/dev 计数器溢出、USB 网卡拔出重插 const qint64 rxDelta = currentRxBytes - m_lastRxBytes; const qint64 txDelta = currentTxBytes - m_lastTxBytes; - m_downloadSpeed = (rxDelta > 0 ? rxDelta : 0) / elapsedSec; - m_uploadSpeed = (txDelta > 0 ? txDelta : 0) / elapsedSec; + const qint64 rxDeltaClamped = rxDelta > 0 ? rxDelta : 0; + const qint64 txDeltaClamped = txDelta > 0 ? txDelta : 0; + m_downloadSpeed = rxDeltaClamped / elapsedSec; + m_uploadSpeed = txDeltaClamped / elapsedSec; + // 累加会话总量:原实现直接取计数器值,切换网卡/网卡重启时总量跳变; + // 改为累加增量后,总量 = 本次会话期间所有活动接口的流量总和,不再跳变 + m_totalDownload += rxDeltaClamped; + m_totalUpload += txDeltaClamped; } m_lastRxBytes = currentRxBytes;