|
22 | 22 | #include <QStackedWidget> |
23 | 23 | #include <QSettings> |
24 | 24 | #include <QFile> |
| 25 | +#include <QDateTime> |
25 | 26 |
|
26 | 27 | DiskBadSectorsDialog::DiskBadSectorsDialog(QWidget *parent) : DDialog(parent) |
27 | 28 | { |
@@ -583,6 +584,11 @@ void DiskBadSectorsDialog::onStartVerifyButtonClicked() |
583 | 584 | m_usedTimeLabel->setText(tr("Time elapsed:") + "00:00:00"); |
584 | 585 | m_unusedTimeLabel->setText(tr("Time left:") + "00:00:00"); |
585 | 586 |
|
| 587 | + // 初始化实际时间跟踪 |
| 588 | + m_realStartTime = QDateTime::currentMSecsSinceEpoch(); |
| 589 | + m_totalPausedTime = 0; |
| 590 | + m_isPaused = false; |
| 591 | + |
586 | 592 | QFile file("/tmp/CheckData.conf"); |
587 | 593 | if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) { |
588 | 594 | QTextStream out(&file); |
@@ -726,18 +732,45 @@ void DiskBadSectorsDialog::onCheckTimeOut() |
726 | 732 | m_settings->setValue("CurCylinder",lst.at(1)); |
727 | 733 | m_settings->endGroup(); |
728 | 734 |
|
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; |
736 | 768 |
|
| 769 | + // 显示实际已用时间 |
737 | 770 | qint64 usedHour = 0; |
738 | 771 | qint64 usedMinute = 0; |
739 | 772 | qint64 usedSecond = 0; |
740 | | - mSecsToTime(m_curCheckTime, usedHour, usedMinute, usedSecond); |
| 773 | + mSecsToTime(realElapsedTime, usedHour, usedMinute, usedSecond); |
741 | 774 | 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 |
742 | 775 |
|
743 | 776 | qint64 remainingHour = 0; |
@@ -793,6 +826,10 @@ void DiskBadSectorsDialog::onStopButtonClicked() |
793 | 826 | m_curType = StatusType::StopCheck; |
794 | 827 | m_cylinderInfoWidget->setChecked(false); |
795 | 828 |
|
| 829 | + // 记录暂停开始时间 |
| 830 | + m_pauseStartTime = QDateTime::currentMSecsSinceEpoch(); |
| 831 | + m_isPaused = true; |
| 832 | + |
796 | 833 | int checkSize = m_settings->value("SettingData/CheckSize").toInt(); |
797 | 834 | int blockStart = m_settings->value("SettingData/BlockStart").toInt(); |
798 | 835 | int blockEnd = m_settings->value("SettingData/BlockEnd").toInt(); |
@@ -828,6 +865,14 @@ void DiskBadSectorsDialog::onContinueButtonClicked() |
828 | 865 | m_curType = StatusType::Check; |
829 | 866 | m_cylinderInfoWidget->setChecked(true); |
830 | 867 |
|
| 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 | + |
831 | 876 | int checkSize = m_settings->value("SettingData/CheckSize").toInt(); |
832 | 877 | int blockEnd = m_settings->value("SettingData/BlockEnd").toInt(); |
833 | 878 | int checkNumber = m_settings->value("SettingData/CheckNumber").toInt(); |
@@ -873,6 +918,12 @@ void DiskBadSectorsDialog::onAgainVerifyButtonClicked() |
873 | 918 | m_curCheckNumber = 0; |
874 | 919 | m_curCheckTime = 0; |
875 | 920 |
|
| 921 | + // 重置实际时间跟踪 |
| 922 | + m_realStartTime = QDateTime::currentMSecsSinceEpoch(); |
| 923 | + m_totalPausedTime = 0; |
| 924 | + m_isPaused = false; |
| 925 | + m_pauseStartTime = 0; |
| 926 | + |
876 | 927 | int checkSize = m_settings->value("SettingData/CheckSize").toInt(); |
877 | 928 | m_blockStart = m_settings->value("SettingData/BlockStart").toInt(); |
878 | 929 | m_blockEnd = m_settings->value("SettingData/BlockEnd").toInt(); |
@@ -926,6 +977,12 @@ void DiskBadSectorsDialog::onResetButtonClicked() |
926 | 977 | m_curRepairTime = 0; |
927 | 978 | m_cylinderInfoWidget->setChecked(false); |
928 | 979 |
|
| 980 | + // 重置实际时间跟踪 |
| 981 | + m_realStartTime = 0; |
| 982 | + m_totalPausedTime = 0; |
| 983 | + m_isPaused = false; |
| 984 | + m_pauseStartTime = 0; |
| 985 | + |
929 | 986 | m_verifyComboBox->setCurrentIndex(0); |
930 | 987 | m_startLineEdit->setText("0"); |
931 | 988 | m_startLineEdit->lineEdit()->setPlaceholderText("0"); |
|
0 commit comments