fix: 总量统计改为累加会话增量而非取计数器值

原 m_totalDownload = currentRxBytes 直接取活动接口计数器值,切换
网卡时跳变到新接口计数器,网卡重启时归零,语义有误导。

改为 m_totalDownload += rxDeltaClamped 累加会话增量,总计从 0
开始增长,切换网卡不再跳变。跨重启持久化属于后续 #18 的范畴。
This commit is contained in:
2026-07-23 00:11:09 +08:00
parent af7ae6b334
commit 42028d93bd
2 changed files with 12 additions and 9 deletions
+3 -2
View File
@@ -17,8 +17,9 @@
~~网卡重启、`/proc/net/dev` 计数器溢出或接口重置时,`currentRxBytes - m_lastRxBytes` 可能为负。代码无任何兜底,QML 会显示负速度。~~ ~~网卡重启、`/proc/net/dev` 计数器溢出或接口重置时,`currentRxBytes - m_lastRxBytes` 可能为负。代码无任何兜底,QML 会显示负速度。~~
已在 `calculateSpeed()` 中对 `rxDelta` / `txDelta` 钳制为 0,计数器回绕/接口重置/网卡重启时不再产生负速度。 已在 `calculateSpeed()` 中对 `rxDelta` / `txDelta` 钳制为 0,计数器回绕/接口重置/网卡重启时不再产生负速度。
**3. "总量统计"语义有误导** **3. ~~"总量统计"语义有误导~~ ✅ 已修复**
`m_totalDownload = currentRxBytes` 只存储活动接口的当前计数器值,并非真正的累计流量。它会在以下场景跳变:切换网卡(跳到新接口计数器)、网卡重启(归零)、系统重启(归零)。README 宣称"累计上传/下载流量统计",但实际不是跨重启/跨接口的累计。 ~~`m_totalDownload = currentRxBytes` 只存储活动接口的当前计数器值,并非真正的累计流量。~~
已改为累加会话增量 `m_totalDownload += rxDeltaClamped`"总计"语义从"活动接口计数器值"变为"本次会话累计流量":从 0 开始增长,切换网卡不再跳变,网卡重启不归零。跨重启持久化属于 #18 的范畴。
**4. 独立窗口不支持深色模式** **4. 独立窗口不支持深色模式**
`AboutWindow.qml``SettingsWindow.qml``TextColorPicker.qml``TrafficChartWindow.qml` 全部硬编码浅色(`#FFFFFF``#333333``#f5f5f5` 等),不随系统主题适配。而 `networkview.qml``NetworkPopup.qml` 正确地从 `DockPalette` 派生颜色。deepin 深色模式下这些窗口视觉割裂严重。 `AboutWindow.qml``SettingsWindow.qml``TextColorPicker.qml``TrafficChartWindow.qml` 全部硬编码浅色(`#FFFFFF``#333333``#f5f5f5` 等),不随系统主题适配。而 `networkview.qml``NetworkPopup.qml` 正确地从 `DockPalette` 派生颜色。deepin 深色模式下这些窗口视觉割裂严重。
+9 -7
View File
@@ -372,18 +372,20 @@ void NetworkMonitorApplet::calculateSpeed()
// 改为除以真实间隔后,无论定时器抖动如何速度都准确。 // 改为除以真实间隔后,无论定时器抖动如何速度都准确。
const double elapsedSec = (nowMs - m_lastTimestampMs) / 1000.0; const double elapsedSec = (nowMs - m_lastTimestampMs) / 1000.0;
// 更新总量 // 仅当间隔合法时计算速度并累加会话流量,避免除零;间隔为 0 时保持上次值
m_totalDownload = currentRxBytes;
m_totalUpload = currentTxBytes;
// 仅当间隔合法时计算速度,避免除零;间隔为 0 时保持上次速度值
if (elapsedSec > 0) { if (elapsedSec > 0) {
// 计数器回绕/接口重置时差值可能为负,钳制为 0 避免显示负速度 // 计数器回绕/接口重置时差值可能为负,钳制为 0 避免显示负速度
// 触发场景:网卡重启、/proc/net/dev 计数器溢出、USB 网卡拔出重插 // 触发场景:网卡重启、/proc/net/dev 计数器溢出、USB 网卡拔出重插
const qint64 rxDelta = currentRxBytes - m_lastRxBytes; const qint64 rxDelta = currentRxBytes - m_lastRxBytes;
const qint64 txDelta = currentTxBytes - m_lastTxBytes; const qint64 txDelta = currentTxBytes - m_lastTxBytes;
m_downloadSpeed = (rxDelta > 0 ? rxDelta : 0) / elapsedSec; const qint64 rxDeltaClamped = rxDelta > 0 ? rxDelta : 0;
m_uploadSpeed = (txDelta > 0 ? txDelta : 0) / elapsedSec; const qint64 txDeltaClamped = txDelta > 0 ? txDelta : 0;
m_downloadSpeed = rxDeltaClamped / elapsedSec;
m_uploadSpeed = txDeltaClamped / elapsedSec;
// 累加会话总量:原实现直接取计数器值,切换网卡/网卡重启时总量跳变;
// 改为累加增量后,总量 = 本次会话期间所有活动接口的流量总和,不再跳变
m_totalDownload += rxDeltaClamped;
m_totalUpload += txDeltaClamped;
} }
m_lastRxBytes = currentRxBytes; m_lastRxBytes = currentRxBytes;