Skip to content

Commit 20efc26

Browse files
committed
feat: Enhance time tracking in DiskBadSectorsDialog
Changes: 1. Added real-time tracking for elapsed time during disk checks. 2. Implemented pause functionality to accurately account for time spent paused. 3. Updated progress calculation based on actual elapsed time. Log: Improved time management for disk sector checks, providing a more accurate user experience. Bug: https://pms.uniontech.com/bug-view-324195.html
1 parent 93a5108 commit 20efc26

3 files changed

Lines changed: 73 additions & 9 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ build
44
.qmake.stash
55
*.qm
66
.cache/*
7-
.claude/*
7+
.claude/*
8+
.cursor/*

application/widgets/diskbadsectorsdialog.cpp

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <QStackedWidget>
2323
#include <QSettings>
2424
#include <QFile>
25+
#include <QDateTime>
2526

2627
DiskBadSectorsDialog::DiskBadSectorsDialog(QWidget *parent) : DDialog(parent)
2728
{
@@ -583,6 +584,11 @@ void DiskBadSectorsDialog::onStartVerifyButtonClicked()
583584
m_usedTimeLabel->setText(tr("Time elapsed:") + "00:00:00");
584585
m_unusedTimeLabel->setText(tr("Time left:") + "00:00:00");
585586

587+
// 初始化实际时间跟踪
588+
m_realStartTime = QDateTime::currentMSecsSinceEpoch();
589+
m_totalPausedTime = 0;
590+
m_isPaused = false;
591+
586592
QFile file("/tmp/CheckData.conf");
587593
if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
588594
QTextStream out(&file);
@@ -726,18 +732,45 @@ void DiskBadSectorsDialog::onCheckTimeOut()
726732
m_settings->setValue("CurCylinder",lst.at(1));
727733
m_settings->endGroup();
728734

729-
qint64 totalTime = m_curCheckTime / m_curCheckNumber * m_totalCheckNumber;
730-
int value = QString::number((float)m_curCheckTime / totalTime,'f', 2).toFloat() * 100;
731-
value > 99 ? value = 99 : value;
732-
733-
m_progressBar->setValue(value);
734-
qint64 remainingTime = totalTime - m_curCheckTime;
735-
remainingTime < 1000 ? remainingTime = 1000 : remainingTime;
735+
// 使用实际经过时间计算已用时间
736+
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
737+
qint64 realElapsedTime = currentTime - m_realStartTime - m_totalPausedTime;
738+
739+
// 如果当前是暂停状态,不包括当前暂停期间的时间
740+
if (m_isPaused && m_pauseStartTime > 0) {
741+
qint64 currentPauseDuration = currentTime - m_pauseStartTime;
742+
realElapsedTime -= currentPauseDuration;
743+
}
744+
745+
// 确保已用时间不为负数
746+
if (realElapsedTime < 0) realElapsedTime = 0;
747+
748+
// 基于柱面检测时间估算总时间(用于剩余时间计算)
749+
qint64 estimatedTotalTime = m_curCheckTime / m_curCheckNumber * m_totalCheckNumber;
750+
751+
// 计算进度百分比(基于检测数量)
752+
int progressValue = (m_curCheckNumber * 100) / m_totalCheckNumber;
753+
if (progressValue > 99) progressValue = 99;
754+
m_progressBar->setValue(progressValue);
755+
756+
// 基于实际时间和进度估算剩余时间
757+
qint64 remainingTime = 0;
758+
if (m_curCheckNumber > 0 && realElapsedTime > 0) {
759+
// 使用实际已用时间来估算剩余时间
760+
qint64 avgTimePerCylinder = realElapsedTime / m_curCheckNumber;
761+
remainingTime = avgTimePerCylinder * (m_totalCheckNumber - m_curCheckNumber);
762+
} else {
763+
// 回退到基于柱面时间的估算
764+
remainingTime = estimatedTotalTime - m_curCheckTime;
765+
}
766+
767+
if (remainingTime < 1000) remainingTime = 1000;
736768

769+
// 显示实际已用时间
737770
qint64 usedHour = 0;
738771
qint64 usedMinute = 0;
739772
qint64 usedSecond = 0;
740-
mSecsToTime(m_curCheckTime, usedHour, usedMinute, usedSecond);
773+
mSecsToTime(realElapsedTime, usedHour, usedMinute, usedSecond);
741774
m_usedTimeLabel->setText(tr("Time elapsed:") + QString("%1:%2:%3").arg(usedHour, 2, 10, QLatin1Char('0')).arg(usedMinute, 2, 10, QLatin1Char('0')).arg(usedSecond, 2, 10, QLatin1Char('0'))); // 时、分、秒为一位数时,十位自动补0
742775

743776
qint64 remainingHour = 0;
@@ -793,6 +826,10 @@ void DiskBadSectorsDialog::onStopButtonClicked()
793826
m_curType = StatusType::StopCheck;
794827
m_cylinderInfoWidget->setChecked(false);
795828

829+
// 记录暂停开始时间
830+
m_pauseStartTime = QDateTime::currentMSecsSinceEpoch();
831+
m_isPaused = true;
832+
796833
int checkSize = m_settings->value("SettingData/CheckSize").toInt();
797834
int blockStart = m_settings->value("SettingData/BlockStart").toInt();
798835
int blockEnd = m_settings->value("SettingData/BlockEnd").toInt();
@@ -828,6 +865,14 @@ void DiskBadSectorsDialog::onContinueButtonClicked()
828865
m_curType = StatusType::Check;
829866
m_cylinderInfoWidget->setChecked(true);
830867

868+
// 累加暂停时间
869+
if (m_isPaused && m_pauseStartTime > 0) {
870+
qint64 pauseDuration = QDateTime::currentMSecsSinceEpoch() - m_pauseStartTime;
871+
m_totalPausedTime += pauseDuration;
872+
m_isPaused = false;
873+
m_pauseStartTime = 0;
874+
}
875+
831876
int checkSize = m_settings->value("SettingData/CheckSize").toInt();
832877
int blockEnd = m_settings->value("SettingData/BlockEnd").toInt();
833878
int checkNumber = m_settings->value("SettingData/CheckNumber").toInt();
@@ -873,6 +918,12 @@ void DiskBadSectorsDialog::onAgainVerifyButtonClicked()
873918
m_curCheckNumber = 0;
874919
m_curCheckTime = 0;
875920

921+
// 重置实际时间跟踪
922+
m_realStartTime = QDateTime::currentMSecsSinceEpoch();
923+
m_totalPausedTime = 0;
924+
m_isPaused = false;
925+
m_pauseStartTime = 0;
926+
876927
int checkSize = m_settings->value("SettingData/CheckSize").toInt();
877928
m_blockStart = m_settings->value("SettingData/BlockStart").toInt();
878929
m_blockEnd = m_settings->value("SettingData/BlockEnd").toInt();
@@ -926,6 +977,12 @@ void DiskBadSectorsDialog::onResetButtonClicked()
926977
m_curRepairTime = 0;
927978
m_cylinderInfoWidget->setChecked(false);
928979

980+
// 重置实际时间跟踪
981+
m_realStartTime = 0;
982+
m_totalPausedTime = 0;
983+
m_isPaused = false;
984+
m_pauseStartTime = 0;
985+
929986
m_verifyComboBox->setCurrentIndex(0);
930987
m_startLineEdit->setText("0");
931988
m_startLineEdit->lineEdit()->setPlaceholderText("0");

application/widgets/diskbadsectorsdialog.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,12 @@ private slots:
239239
int m_blockStart = 0;
240240
int m_blockEnd = 0;
241241
DeviceInfo m_deviceInfo;
242+
243+
// 实际时间跟踪
244+
qint64 m_realStartTime = 0; // 检测开始的实际时间戳
245+
qint64 m_pauseStartTime = 0; // 暂停开始时间戳
246+
qint64 m_totalPausedTime = 0; // 总的暂停时间
247+
bool m_isPaused = false; // 是否处于暂停状态
242248
};
243249

244250
#endif // DISKBADSECTORSDIALOG_H

0 commit comments

Comments
 (0)